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