Don't Parse, Use Parsing Objects

The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:

Традиционным способом интеграции объектно-ориентированной серверной части с внешней системой является использование объектов передачи данных, которые сериализуются в JSON перед отправкой и десериализуются при возвращении. Этот подход популярен, но неверен. Часть сериализации должна быть заменена принтерами, о которых я рассказывал ранее. Вот мой подход к десериализации, которую следует выполнять с помощью - догадайтесь - объектов.

Предположим, что есть точка входа в серверную часть, которая должна зарегистрировать новую книгу в библиотеке, получив ее в формате JSON:

Также есть объект класса Library, который ожидает, что объект типа Book будет передан в его метод register():

Также скажите, что тип Book имеет простой метод isbn():

Вот точка входа HTTP (я использую Takes и Cactoos), которая принимает POST-запрос multipart/form-data и регистрирует книгу в библиотеке.

Что не так с этим? Ну, несколько вещей.

Во-первых, он не является переиспользуемым. Если нам понадобится что-то подобное в другом месте, нам придется снова написать обработку HTTP и разбор JSON.

Во-вторых, обработка ошибок и проверка не являются также переиспользуемыми. Если мы добавим это в вышеуказанный метод, нам придется скопировать это везде. Конечно, DTO может инкапсулировать это, но обычно это не то, для чего предназначены DTO.

В-третьих, код выше довольно процедурный и имеет много временной связности.

Лучшим решением было бы скрыть этот разбор внутри нового класса JsonBook:

Затем, RESTful точка входа будет выглядеть следующим образом:

Это не более изящно?

Вот несколько примеров из моих проектов: RqUser из zerocracy/farm и RqUser из yegor256/jare.

Как вы можете видеть из приведенных выше примеров, иногда мы не можем использовать implements, потому что некоторые примитивы в Java не являются интерфейсами, а являются финальными классами: String является “идеальным” примером. Вот почему мне приходится делать это:

Но помимо этого, эти примеры отлично демонстрируют принцип “разбора объектов”, о котором упоминалось выше.

Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-28 at 14:49

sixnines availability badge   GitHub stars