Является ли использование ВО (POCO) плохим дизайном
шаблон? Некоторые люди говорят, что все
доменная логика объекта должна быть
вместе в этом объекте.
Я думаю, что здесь много путаницы, потому что есть два почти полностью противоречивых определения"объекта значения".
- Одним из них является " Объект с семантикой значения ", то есть неизменный и часто проверяемый на правильность при построении.
- Другим является " Объект, который имеет состояние, но не имеет логики ". Я думаю, это то, что вы имеете в виду. Лучше называть это объектом передачи данных, так как это выражение лучше определено.
POCO / POJO также не является подходящим выражением, поскольку оно также не означает отсутствие логики, только то, что не требуется никакого конкретного суперкласса, интерфейса или улучшения байт-кода.
Что касается вашего вопроса: иметь модель предметной области в классах без логики по любой другой причине, кроме как видеть, как другие люди делают это таким образом, и иметь имя для нее действительно очень плохой дизайн - это анти-паттерн, известный как модель анемичного домена . К сожалению, был ряд плохо спроектированных фреймворков (сейчас вообще заброшенных), которые требовали и продвигали этот «шаблон».
В нем игнорируется фундаментальная идея ориентации объекта: инкапсуляция данных с помощью логики, которая на них работает, и, как правило, приводит к подробному, негибкому и хрупкому коду, поскольку теперь внешняя логика должна вызываться явно и передаваться модели, она становится гораздо труднее гарантировать, что недопустимые данные не будут переданы, а знания о структуре модели предметной области широко распространены.
При этом, безусловно, неверно, что «вся логика домена объекта должна быть вместе в этом объекте» - иногда есть веские причины извлечь некоторую логики домена и сохранить ее в отдельные классы:
- Когда речь идет не о доменной логике, а о техническом аспекте, таком как постоянство, это должно быть на отдельном уровне
- когда логика отличается в разных частях приложения
- обычно, когда все настолько сложно, что классы домена становятся слишком большими, и вам нужно структурировать их больше.
Но, как правило, логика домена, относящаяся к объекту, должна быть частью этого объекта, если только у вас нет особой причины поместить его в другое место .