The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
JAXB - это десятилетняя технология Java, которая позволяет преобразовывать Java-объект в XML-документ (маршалинг) и обратно (демаршалинг). Эта технология основана на сеттерах и геттерах и, по моему мнению, нарушает основные принципы объектно-ориентированного программирования, превращая объекты в пассивные структуры данных. Я рекомендую вам вместо этого использовать Xembly для маршалинга Java-объектов в XML-документы.
Вот как работает маршалинг JAXB. Предположим, у вас есть класс Book
, который нужно преобразовать в XML-документ. Вы должны создать геттеры и аннотировать их:
Затем вы создаете маршаллер и просите его преобразовать экземпляр класса Book
в XML:
Вы должны ожидать что-то подобное в результате:
Так в чем проблема? Почти то же самое, что и с объектно-реляционным отображением, что объясняется в статье “ORM является оскорбительным анти-паттерном”. JAXB рассматривает объект как набор данных, извлекает данные и преобразует их в XML в соответствии с собственными правилами JAXB. Объект не имеет контроля над этим процессом. Таким образом, объект перестает быть объектом, а становится пассивным набором данных.
Идеальным подходом было бы переразработать наш класс Book
следующим образом:
Однако у этого подхода есть несколько проблем. Во-первых, есть огромное дублирование кода. Построение XML-документа - довольно многословный процесс на Java. Если каждому классу пришлось бы реализовывать его в своем методе toXML()
, у нас возникли бы большие проблемы с дублированием кода.
Вторая проблема заключается в том, что мы не знаем точно, в каком формате должен быть представлен наш XML-документ. Это может быть String
, InputStream
или, может быть, экземпляр org.w3c.dom.Document
. Создание множества методов toXML()
в каждом объекте определенно привело бы к катастрофе.
Xembly предоставляет решение. Как я уже упоминал ранее, это императивный язык для создания и манипуляции с XML. Вот как мы можем реализовать наш объект Book
с помощью Xembly:
Теперь, чтобы построить XML-документ, мы должны использовать этот код вне объекта:
Этот класс Xembler
преобразует директивы Xembly в XML-документ.
Преимущество этого решения заключается в том, что внутренние данные объекта не раскрываются с помощью геттеров, и объект полностью контролирует процесс маршалинга XML. Кроме того, сложность этих директив может быть очень высокой - намного выше, чем у неуклюжих аннотаций JAXB.
Xembly - это проект с открытым исходным кодом, поэтому не стесняйтесь задавать вопросы или предлагать исправления на GitHub.
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-12-15 at 06:25