TL;DR:
DTO описывает схему передачи состояния. POCO ничего не описывает. Это еще один способ сказать «объект» в ООП. Он происходит от POJO (Java), придуманного Мартином Фаулером, который буквально описывает его как более красивое название для «объекта», потому что «объект» не очень привлекателен.
DTO - это шаблон объекта, используемый для передачи состояния между интересующими уровнями. Они могут иметь поведение (т.е. технически могут быть poco) до тех пор, пока это поведение не изменяет состояние. Например, у него может быть метод, который сериализует себя.
POCO - это простой объект, но под «простым» подразумевается то, что он не особенный. Это просто означает, что это объект CLR без подразумеваемого шаблона. Общий термин. Он не предназначен для работы с другими фреймворками. Так что, если ваш POCO имеет [JsonProperty]
или EF-украшения по всем своим свойствам, например, тогда я бы сказал, что это не POCO.
Вот несколько примеров различных видов паттернов объектов для сравнения:
- Модель представления: используется для моделирования данных для представления. Обычно имеет аннотации к данным для облегчения привязки и проверки. В MVVM он также действует как контроллер. Это больше, чем DTO
- Объект значения: используется для представления значений.
- Aggregate Root: используется для управления состоянием и инвариантами.
- Обработчики: используются для ответа на событие / сообщение.
- Атрибуты: используются в качестве украшения для решения общих проблем.
- Сервис: используется для выполнения сложных задач.
- Контроллер: используется для управления потоком запросов и ответов.
- Завод: используется для настройки и / или сборки сложных объектов для использования, когда конструктор недостаточно хорош. Также используется для принятия решений о том, какие объекты необходимо создать во время выполнения.
- Репозиторий / DAO: используется для доступа к данным.
Все это просто объекты, но обратите внимание, что большинство из них обычно привязано к узору. Таким образом, вы можете называть их «объектами» или уточнить его намерение и назвать его тем, чем оно является. Вот почему у нас есть шаблоны проектирования; описать сложные концепции в нескольких работах. DTO - это шаблон. Совокупный корень - это шаблон, модель представления - это шаблон (например, MVC и MVVM). POCO - это не шаблон.
POCO не описывает шаблон. Это просто другой способ обращения к классам / объектам в ООП. Думайте об этом как об абстрактном понятии; они могут иметь в виду что угодно. ИМО, есть односторонние отношения, потому что, как только объект достигает точки, где он может чисто служить только одной цели, он больше не является POCO. Например, как только вы разметите свой класс украшениями, чтобы он работал с какой-либо структурой, он больше не является POCO. Следовательно:
- DTO - это POCO
- POCO - это не DTO
- Модель представления - это POCO
- POCO - это не модель просмотра
Смысл в том, чтобы проводить различие между ними, состоит в том, чтобы сохранять четкие и последовательные шаблоны, чтобы не перекрестно беспокоиться и не приводить к тесной связи. Например, если у вас есть бизнес-объект, у которого есть методы для изменения состояния, но он также чертовски украшен украшениями EF для сохранения на SQL Server И JsonProperty, чтобы его можно было отправить обратно через конечную точку API. Этот объект будет нетерпимым к изменению и, вероятно, будет завален вариантами свойств (например, UserId, UserPk, UserKey, UserGuid, где некоторые из них помечены, чтобы не сохраняться в БД, а другие помечены, чтобы не сериализоваться в JSON в конечной точке API).
Так что, если бы вы сказали мне, что что-то было DTO, я бы, вероятно, позаботился о том, чтобы оно никогда не использовалось ни для чего, кроме перемещения состояния. Если бы вы сказали мне, что что-то было моделью представления, я бы, вероятно, убедился, что это не сохраняется в базе данных. Если бы вы сказали мне, что что-то было моделью предметной области, я бы, вероятно, удостоверился, что она не зависит от чего-либо вне домена. Но если бы вы сказали мне, что что-то было POCO, вы бы вообще не рассказали мне много.
person
Sinaesthetic
schedule
04.08.2019