Який сенс використання DTO (об'єктів передачі даних)?


132

У чому сенс використання DTO і чи це застаріла концепція? Я використовую POJO s на рівні перегляду для передачі та збереження даних. Чи можна розцінювати ці POJO як альтернативу DTO?


10
Але POJO може бути DTO, і DTO можна реалізувати разом з POJO. Ви використовуєте яблука та апельсини.
Ейфорія

3
Чому хороші ідеї повинні застаріти? Подивіться на Лісп. Крім жартів, я погоджуюся з Euphoric: Я зазвичай реалізую використання DTO за допомогою POJO. Я все ще вважаю, що DTO - це дуже проста (KISS) та корисна концепція.
Джорджо

Немає сенсу, це анти-шаблон, див .: Об'єкт передачі даних - це сором
yegor256

Відповіді:


115

DTO - це шаблон, і реалізація (POJO / POCO) не залежить. DTO каже, оскільки кожен дзвінок на будь-який віддалений інтерфейс дорогий, відповідь на кожен дзвінок повинна приносити якомога більше даних. Отже, якщо для отримання даних для певної задачі потрібно декілька запитів, дані, що підлягають передачі, можуть бути об'єднані в DTO, так що лише один запит може принести всі необхідні дані. Каталог шаблонів архітектури корпоративних додатків містить більше деталей.

ЗНО - це фундаментальне поняття, не застаріле.


9
ви можете знайти їх під різними іменами, оскільки, здається, кожен заново
вигадує

3
Як "Об'єкт цінності".
theD

2
@linkerro: Правда: я думаю, що багатьом людям слід витрачати більше часу на читання речей, які вже були винайдені, а не переосмислення їх самих. Повторно винайдені речі завжди будуть менш зрілими.
Джорджіо

10
@Giorgio Там багато дияволів все ще працює з ідеями, які ніколи не повинні збивати його з землі. Мені б хотілося, щоб більше чортів ставили під сумнів кожну ідею, яку вони читали.
Ерік Реппен

59

DTO як концепція (об'єкти, метою яких є збір даних, що повертаються клієнтові сервером), безумовно, не застаріла.

Що є дещо застарілим , є поняття того DTOs , які не містять ніякої логіки взагалі, використовуються тільки для передачі даних і «карту» з об'єктів предметної області перед передачею клієнтові, і відображається для перегляду моделей , перш ніж передати їх в шар дисплея. У простих програмах об'єкти домену часто можуть бути безпосередньо використані як DTO і передані безпосередньо на рівень відображення, щоб існувала лише одна уніфікована модель даних. Для більш складних додатків ви не хочете виставляти клієнту всю доменну модель, тому необхідне відображення від доменних моделей до DTO. Наявність окремої моделі перегляду, що дублює дані з DTO, майже ніколи не має сенсу.

Однак причина цього поняття застаріла, а не просто невірна, полягає в тому, що деякі (в основному старіші) рамки / технології цього вимагають, оскільки їх доменні та переглядні моделі не є POJOS, а замість цього прив’язані безпосередньо до рамки.

Найголовніше, що Entity Beans в J2EE до стандарту EJB 3 не були POJO, а замість цього були проксі-об'єкти, побудовані сервером додатків - просто неможливо було надіслати їх клієнтові, тому у вас не було іншого вибору щодо вилучення окремого шару DTO. - це було обов’язково.


2
Як розробник інтерфейсу, змушений виконувати більш загальну роль, я, безумовно, виявив явище Mapper.Map у нашій кодовій базі дурним. Чому DTO не може просто відобразити себе?
Ерік Реппен

1
@ErikReppen Основна перевага - це роз'єднання моделей домену та DTO. Якщо ваш DTO відображає себе, він потребує посилання на ваші моделі домену.
Олександр Дерк

17

Хоча DTO не є застарілим шаблоном, він часто застосовується без потреби, що може зробити його застарілим.

Найбільш зловживаний зразок у спільноті Java Enterprise - це DTO. DTO був чітко визначений як вирішення проблеми розподілу. DTO мав бути грубозернистим контейнером даних, який ефективно переносить дані між процесами (ярусами). ~ Адам Біен

Наприклад, скажіть, що у вас є JSF ManagedBean. Поширене питання полягає в тому, чи повинен боб безпосередньо посилатись на сутність JPA або він повинен підтримувати посилання на якийсь посередницький об'єкт, який згодом перетворюється на Сутність. Я чув про цей посередницький об'єкт, який називається DTO, але якщо ваші ManagedBeans та Entities працюють в межах одного JVM, використання схеми DTO мало користі.

Розглянемо примітки щодо перевірки квасолі. Ваші організації JPA, ймовірно, помічені за допомогою перевірок @NotNull та @Size. Якщо ви використовуєте DTO, вам потрібно повторити ці перевірки у вашому DTO, щоб клієнтам, які використовують ваш віддалений інтерфейс, не потрібно надсилати повідомлення, щоб дізнатися, що вони не виконали основну перевірку. Уявіть собі всю додаткову роботу з копіювання анотацій перевірки Bean між вашим DTO та Entity, але якщо ваш View і Entities працюють в межах одного JVM, не потрібно братися за цю додаткову роботу: просто використовуйте Entities.

Посилання IAmTheDude на Каталог шаблонів архітектури прикладних програм підприємства надає стисле пояснення DTO, і тут я знайшов більше посилань:


3
Там є речення: "..., але якщо ваші ManagedBeans та сутності працюють в межах одного JVM, використання схеми DTO мало користі" . У компаніях є багато додатків середнього розміру, які тупо реалізують схему DTO без жодної вигоди. Це просто додає марний "копіювальний шар". Люди, які створили ці системи, не зрозуміли, що менеджер об'єктів Java EE 5+ відмежовує об'єкти, коли транзакція закінчується, і робить їх фактичними DTO. Отже, для веб-сайтів для одного JVM тип шаблону застарілий . Здається, це реліквія розробників J2EE ...
Kawu

Але що таке "JSF ManagedBean" та "JPA Entity"? Якщо вони не застаріли, то ви повинні мати можливість пояснити їх за допомогою термінів рамки та мови агностики.
U Avalos

8

Абсолютно ні! Нещодавно я засвоїв уроки щодо кращого використання DTO, а не вашого бізнес-об’єкта, який ви використовуєте (можливо, пов'язаний з вашим картографічним механізмом ORM).

Однак просто використовуйте їх, коли їх доцільно використовувати, а не лише заради їх використання, оскільки вони згадуються в книзі хороших зразків.
Типовий приклад, який мені просто приходить в голову, - це коли ви виставляєте якийсь інтерфейс третім сторонам. У такому сценарії ви хочете зберегти обмінювані об'єкти досить стабільними, чого зазвичай можна добре досягти за допомогою DTO.


1

Я вважаю, що DTO є особливо корисним - це вміст логіки для відповідей API. За допомогою цього шаблону легко керувати різними типами відповідей від об'єктів до різних форматів перевіряється. Використовуючи цю схему в моїй теперішній ролі, ми змогли почати тестувати формати відповідей для наших API, що було цінним, оскільки наш стек стає все більш ізоморфним для різних клієнтів (http / mobile). Однозначно не застаріла.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.