Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
потому что data driven (или data centric) встречается у других довольно, на мой взгляд, авторитетных гайдлайнах о разработке
Более того, вы не застрахованы от ошибки при моделировании, что может привести к сложному рефакторингу.потому что пути заказчика и его бизнеса неисповедимы и Enterprise разработка отличается частыми и ощутитмыми изменениями требований, а рефакторить rich домен в такой ситуации становится довольно затратно и рефакторится он в сторону anemic.
Поэтому если вы программируете в стиле ООП, анемичная модель просто будет инородной деталькой.
В ООП объекты могут обладать не только данными, но и действиями / методами, это известно всем и на этом строится собственно весь ООП (инкапсуляция, наследования и тп)Крайне редко сущности моделируют что-то содержащее поведение — ордер, инвойс, клиент и пр. — это не модели с поведениями, а скорее документы с информацией о реальных ордерах, инвойсах и пр. Документы не содержат своего поведения.
Сервисы не могут менять внутреннее состояние модели.Тут под сервисами имелись ввиду репозитории, а они могут менять состояние. Да и сервисам домена (из DDD) ничто не мешает менять состояние сущностей.
Вообще, DTO тема тоже отдельная. Уровень DTO зависит от сложности модели.В вьюхих Вы используете DTO или сущности домена? Потому что DDD'шники любят там DTO, а это автоматически создает почти полную копию домена и чаще даже еще больше сущностей, т.к. одно и тоже надо отображать и так и этак и начинаются PersonWithPhotoDTO, PersonFullDto и пр. Я опять-таки не проив этого если данные передаются по сети на клиента, но даже тут можно не писать DTO, если клиента пишет ваша команда и клиент с серверной частью сильно связаны и не имеют нескольких версий протокола одновременно.
anemic model добавляет в жизнь программиста как минимум две «сущности»: модель и сервис, а domain подход, больше стремится к упаковыванию всего этого в модельтолько Rich DDD взамен плодит целых два упомянутых слоя — Mappings и DTO's.
По идее внутреннее состояние менять может только сама модель, ни один сервис, в том числе и репозиторий, не имеет доступа к внутреннему состоянию, а работает только с «интерфейсом» публичных свойств и методов (грубо говоря, сервис не может изменить приватную переменную объекта)Имел ввиду свойства. Закрытые переменные, конечно, сервис изменить не сможет, но если сервису это будет нужно, то переменная превратиться в открытое свойство. Не встречал необходимости что-то прятать в anemic'е от сервисов. Может у Вас есть подходящий пример?
«Крайне редко сущности моделируют что-то содержащее поведение» — да, согласен, это известная проблема, но она приводит к полной дискредитации самого ООП.Вопрос, что такое «поведение»? Обычно нет никако
Поведение — это воздействие на состояние.Ну да, то, что я читал в хелпе к Visual Basic 5.0 в 1998 году. «Классика». Я готов использовать это определение. Остаётся понять, состояние какого из объектов мы меняем, когда заставляем их взаимодействовать. Например, сажаем человека в транспортное средство. Пока либо человек либо транспортное средство — ненужная абстракция, мы можем считать, что меняем состояние только одного объекта (другого из них). Когда не можем один из них считать ненужной абстракцией — anemic object (не буду использовать слишком многозначный термин «модель») так и просится.
Человек, конечно, может сам иметь метод «сесть в транспортное средство»А почему это не метод транспортного средства «принять в себя человека»? Так вот похоливарят-похоливарят, и вынесут логику в сервисы — чтоб ни тому ни этому.
под современным data-driven я понимаю систему из «голых» DTO-классов почти без методов, и набора сервисов с логикой.
Я не понимаю зачем писать целую книжку про SOA
с какой стороны SOA вообще прилетело в тему разговора.
Вот только при чем тут data-driven, если это [система из «голых» DTO-классов почти без методов, и набора сервисов с логикой] прекрасно вписывается, например, в SOA?
Иногда в тему, но в основном — жуткая инертность на изменения и дикие проблемы с производительностью и доступностью.
Звучит как «причем тут сахар, если мед сладкий?»
Проходит время, и нам требуется добавить дополнительную логику в программу — например, находить у ордера товар с самой высокой ценой. Здесь уже могут возникнуть проблемы, если ваша orm не поддерживает внешние связи (т.е. сущностные классы ничего не знаю о контексте данных), в этом случае, придется создавать сервис, в котором будет метод — по ордеру вернуть нужный продукт. Но, наша orm хорошая, умеет работать с внешними связями, и мы просто добавляем метод в класс ордера. Снова радуемся жизни, цель достигнута, в класс добавлен метод, у нас почти настоящее ООП.
Парадигмы программирования. Data Driven vs Domain Driven