Почему объекты передачи данных (DTO) анти-паттерн?
Я недавно подслушал, как люди говорят это объекты передачи данных (DTOs) являются анти-шаблон.
Почему? Каковы альтернативы?
11 ответов:
некоторые проекты имеют все данные дважды. Один раз как объекты домена и один раз как объекты передачи данных.
этой дублирование имеет огромную стоимость, поэтому архитектура должна получить огромную выгоду от этого разделения, чтобы оно того стоило.
DTO не являются анти-шаблон. Когда вы отправляете некоторые данные по проводу (например, на веб-страницу в вызове Ajax), вы хотите быть уверены, что вы сохраняете пропускную способность, отправляя только данные, которые будет использовать назначение. Кроме того, часто для уровня представления удобно иметь данные в несколько ином формате, чем собственный бизнес-объект.
Я знаю, что это Java-ориентированный вопрос, но в языках .NET анонимные типы, сериализация и LINQ позволяют DTO быть построенный на лету, который уменьшает установку и накладные расходы использования их.
DTO антипаттерн в EJB 3.0 говорит:
тяжеловесная природа сущности Фасоль в спецификациях EJB до EJB 3.0 в результате использования шаблоны проектирования, такие как передача данных Объекты (DTO). Объекты переноса данных стал легкие объекты (которые должны иметь были ли сами бобы сущности первое место), используется для отправки данные по всем уровням... теперь в версии EJB 3.0 спецификация делает модель объекта bean такой же как простой старый объект Java (POJO). С эта новая модель POJO, вы не будете больше не нужно создавать для каждого сущность или для набора сущностей... Если вы хотите отправить объекты EJB 3.0 по всему ярусу сделать их просто реализовать Java.Ио.Serialiazable
Я не думаю, что DTO-это анти-шаблон как таковой, но есть антипаттеры, связанные с использованием DTO. Билл Дадни ссылается на взрыв DTO в качестве примера:
http://www.softwaresummit.com/2003/speakers/DudneyJ2EEAntiPatterns.pdf
здесь также упоминается ряд злоупотреблений DTO:
http://anirudhvyas.com/root/2008/04/19/abuses-of-dto-pattern-in-java-world/
Они возникли из-за трехуровневых систем (обычно использующих EJB в качестве технологии) в качестве средства передачи данных между уровнями. Большинство современных Java-систем, основанных на таких фреймворках, как Spring, используют альтернативный упрощенный вид, используя POJOs в качестве объектов домена (часто аннотированных JPA и т. д...) в один ярус... Использование DTO здесь не нужно.
пуристы OO сказали бы, что DTO является анти-шаблоном, потому что объекты становятся представлениями таблиц данных вместо реальных объектов домена.
некоторые считают ДТО анти-шаблон из-за их возможных злоупотреблений. Они часто используются, когда они не должны быть/не должны быть.
в этой статье смутно описывает некоторые злоупотребления.
Если вы строите распределенную систему, то DTO, безусловно, не являются анти-шаблоном. Не все будут развиваться в этом смысле, но если у вас есть (например) открытое социальное приложение, все работает с JavaScript.
Он будет отправлять нагрузку данных на ваш API. Затем он десериализуется в некоторую форму объекта, обычно объект DTO/Request. Затем это можно проверить, чтобы убедиться, что введенные данные верны перед преобразованием в объект модели.
по-моему, это рассматривается как анти-шаблон, потому что он неправильно используется. Если вы не строите распределенную систему, скорее всего, они вам не нужны.
DTO становится необходимостью, а не анти-шаблоном, когда у вас есть все ваши доменные объекты, загружающие связанные объекты с нетерпением.
Если вы не сделаете DTOs, у вас будут ненужные перенесенные объекты из вашего бизнес-уровня на ваш клиент/веб-уровень.
чтобы ограничить накладные расходы в этом случае, скорее передайте DTOs.
намерение a Объект Передачи Данных - хранить данные из разных источников, а затем передавать ее в базу данных (или Удаленный Фасад) сразу.
, шаблон DTO нарушает Принцип Единой Ответственности, так как DTO не только хранит данные, но и передает их из или в базу данных/фасад.необходимость отделять объекты данных от бизнес-объектов не является антипаттерном, так как это, вероятно, требуется отделить слой базы данных в любом случае.
вместо того, чтобы объекты переноса данных, вы должны использовать агрегатную и модели репозитория, который отделяет коллекции объектов (совокупность) и передачи данных (хранилище).
для передачи группы объектов можно использовать Единица Работы шаблон, который содержит набор репозиториев и контекст транзакции; для передачи каждого объекта в агрегат отдельно в рамках транзакции.
Я думаю, что люди имеют в виду, что это может быть анти-шаблон, если вы реализуете все удаленные объекты как DTO. DTO-это просто набор атрибутов, и если у вас есть большие объекты, вы всегда будете передавать все атрибуты, даже если они вам не нужны или не используются. В последнем случае предпочитают использовать прокси-шаблон.
вопрос должен быть не "почему", а", когда".
определенно анти-шаблон, когда только результат его использования выше стоимость - время выполнения или обслуживания. Я работал над проектами, имеющими сотни DTO, идентичных классам сущностей базы данных. Каждый раз, когда вы хотите добавить одно поле, вы можете добавить идентификатор, например, четыре раза - в DTO, в entity, в преобразование из DTO в доменные классы или сущности, обратное преобразование ... Вы забыли некоторые места и данные стали противоречивыми.
Это не анти-шаблон, когда вам действительно нужно другое представление классов домена - более плоский, более богатый, более узкий,...
лично я начинаю с доменного класса и передаю его по кругу, с правильной проверкой в нужных местах. Я могу аннотировать и / или добавлять некоторые "вспомогательные" классы для создания сопоставлений, в базу данных, в форматы сериализации, такие как JSON или XML ... Я всегда могу разделить класс на два, если я чувствую необходимость.
речь идет о вашей точке зрения-я предпочитаю смотреть на объект домена как на один объект, играющий различные роли, а не на несколько объектов, созданных друг из друга. Если единственная роль объекта-это транспортировка данных, то это DTO.
Comments