Как ограничить доступ к методам дочерних сущностей агрегата?

Обсуждаем, как правильно строить приложения
Ответить
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Как ограничить доступ к методам дочерних сущностей агрегата?

Сообщение sda »

В примерах по DDD везде пишут геттеры для доступа к свойствам агрегата, но если свойство является сущностью, то ничего не мешает вызвать метод этой дочерней сущности за пределами агрегата, чего нельзя делать. Это как-то запрещается на уровне кода? Или это просто соглашение в мире DDD, что нельзя вызывать методы дочерней сущности агрегата за его пределами, но по факту внутренности торчат наружу?

Тоже самое спрашивают здесь http://stackoverflow.com/questions/1080 ... ild-entity
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как ограничить доступ к методам дочерних сущностей агрегата?

Сообщение zelenin »

sda писал(а):В примерах по DDD везде пишут геттеры для доступа к свойствам агрегата, но если свойство является сущностью, то ничего не мешает вызвать метод этой дочерней сущности за пределами агрегата, чего нельзя делать.
почему нельзя?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как ограничить доступ к методам дочерних сущностей агрегата?

Сообщение ElisDN »

sda писал(а):...пишут геттеры для доступа к свойствам агрегата, но если свойство является сущностью, то ничего не мешает вызвать метод этой дочерней сущности за пределами агрегата, чего нельзя делать. Это как-то запрещается на уровне кода?
Если переживаете за инвариант агрегата, то не пишите геттеры, возвращающие саму сущность. Тогда и будет защита от внешних изменений на уровне кода.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Как ограничить доступ к методам дочерних сущностей агрегата?

Сообщение sda »

ElisDN писал(а):
sda писал(а):...пишут геттеры для доступа к свойствам агрегата, но если свойство является сущностью, то ничего не мешает вызвать метод этой дочерней сущности за пределами агрегата, чего нельзя делать. Это как-то запрещается на уровне кода?
Если переживаете за инвариант агрегата, то не пишите геттеры, возвращающие саму сущность. Тогда и будет защита от внешних изменений на уровне кода.
Да переживаю за инвариант. Но мне требуются поля этой дочерней сущности, чтобы потом собрать DTO и отправить в клиент. То есть мне нужно состояние этой дочерней сущности, но в то же время я не хочу, чтобы её методы торчали наружу. Как это решается в мире DDD ?
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Как ограничить доступ к методам дочерних сущностей агрегата?

Сообщение sda »

zelenin писал(а):
sda писал(а):В примерах по DDD везде пишут геттеры для доступа к свойствам агрегата, но если свойство является сущностью, то ничего не мешает вызвать метод этой дочерней сущности за пределами агрегата, чего нельзя делать.
почему нельзя?
В книгах по ddd так пишут, что вся работа с дочерними сущностями должна идти через корень агрегата, чтобы соблюдались все инварианты и никогда не вызывать из вне агрегата дочерние сущности.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как ограничить доступ к методам дочерних сущностей агрегата?

Сообщение zelenin »

а, я не так понял.
Вы имеете в виду такую ситуацию:
$address = $user->getAddress();
$address->setNewStreet(...);

если да, то никак. это элемент архитектуры, то есть устного соглашения, как и "не использовать прямой коннекшн в базу вместо репозитория" - прямой конннекшн тоже можно заюзать без ограничения.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Как ограничить доступ к методам дочерних сущностей агрегата?

Сообщение sda »

Да, я имею ввиду именно такую ситуацию. В книгах по ddd этому уделяется настолько значительный объем внимания, что складывается впечатление, что это что-то очень важное. Поэтому я и подумал, что может быть в ddd существует определенное решение. В гугле совершенно не удалось найти никакого проявления интереса к этой проблеме. Возникает когнитивный диссонанс из-за логического несоответствия. Не выглядит чем-то настолько важным в реальности, как это описано в книгах.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Как ограничить доступ к методам дочерних сущностей агрегата?

Сообщение yiijeka »

setNewStreet(...); просто не надо помещать в $address, это должно быть в билдере $userBulder->setNewStreet($user,$address); Так и ограничиваем.
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Как ограничить доступ к методам дочерних сущностей агрегата?

Сообщение sda »

Вы не можете все методы реализующие ту или иную логику дочерней сущности поместить в билдер или куда-то еще. В дочерней сущности в любом случае будут какие-то методы. И они будут торчать наружу. В этом проблема.
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Как ограничить доступ к методам дочерних сущностей агрегата?

Сообщение yiijeka »

Если они критичны в философском вопросе, то помещаем их в отдельный класс, который будет ответственен за определённую задачу.

Остальное не критичное - пусть торчит. Не выдумывайте проблем на пустом месте. Если кто-то начнёт активно использовать "неправильно" эти методы и при этом проект станет не гибким, трудно изменяемым, то вот тогда и появится проблема, которая решается через паттерн Private class или его производные...
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Как ограничить доступ к методам дочерних сущностей агрегата?

Сообщение sda »

Если кто-то начнёт активно использовать "неправильно" эти методы и при этом проект станет не гибким
Проект станет неверно работающим.
решается через паттерн Private class или его производные...
Судя по описанию паттерна здесь https://en.wikipedia.org/wiki/Private_c ... ta_pattern он не подходит.
It allows the class designer to remove write privilege of attributes that are intended to be set only during construction, even from methods of the target class.
Я не хочу забирать привилегию записи аттрибутов после создания объекта, тем более у методов целевого класса. Задача другая.
Ответить