Идея объединения данных и бизнес-логики состоит в том, чтобы способствовать инкапсуляции и предоставлять как можно меньше внутреннего состояния другим объектам. Таким образом, клиенты могут полагаться на интерфейс, а не на реализацию. См. принцип «говори, не спрашивай» и Закон Деметры . Инкапсуляция облегчает понимание состояний, в которых могут находиться данные, проще для чтения кода, упрощает разделение классов и, как правило, упрощает модульное тестирование.
При экстернализации бизнес-логики (обычно в классы «Сервис» или «Менеджер») возникают вопросы типа «где эти данные используются?» и "В каких штатах это может быть?" гораздо сложнее ответить. Это также процедурный способ мышления, заключенный в объект. Это может привести к модели анемичной области .
Внешнее поведение не всегда плохо. Например, сервисный уровень может координировать доменные объекты, но без принятия на себя их обязанностей по управлению состоянием. Или, когда вы в основном выполняете операции чтения / записи в БД, которые хорошо отображаются на входные формы, возможно, вам вообще не нужна модель предметной области - или болезненные накладные расходы на объектно-реляционное отображение, которые она влечет за собой -
Передача Объекты часто служат для отделения архитектурных слоев друг от друга (или от внешней системы), предоставляя минимальную информацию о состоянии, в которой нуждается вызывающий уровень, без раскрытия какой-либо бизнес-логики.
Это может быть полезно, например, при подготовке информации для представления: просто предоставьте представлению информацию, в которой оно нуждается, и ничего больше, чтобы оно могло сосредоточиться на как отображать информацию, а не какая информация для отображения. Например, TO может представлять собой совокупность нескольких источников данных.
Одним из преимуществ является то, что ваши представления и ваши доменные объекты не связаны между собой. Использование ваших доменных объектов в JSP может затруднить рефакторинг вашего домена и способствует беспорядочному использованию методов получения и установки (следовательно, нарушает инкапсуляцию).
Однако есть и дополнительные затраты, связанные с большим количеством объектов переноса и часто с большим количеством дублирования. Некоторые проекты, над которыми я работал, в конечном итоге отражают другие доменные объекты (которые я считаю анти-паттернами).