JAXB Is Doing It Wrong; Try Xembly

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

sixnines availability badge   GitHub stars