Доменная модель.

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

Доменная модель.

Сообщение sda »

Здравствуйте. У Вон Вернона есть пример реализации форума. Внутри форума можно инициировать новое обсуждение. У Вон Вернона это реализовано таким образом.

Происходит следующее. Метод startDiscussionFor проверяет некоторый инвариант, а именно закрыт форум или нет и в случае если форум всё же не закрыт, то создает объект Discussion и возвращает его. На уровне приложения происходит обращение к данному методу и таким образом инициируется новое обсуждение, после чего происходит его сохранение в хранилище.

Можно по другому. Ниже пример на псевдоязыке.

Код: Выделить всё

class Discussion {
	constructor(Forum forum, string subject, Author author) {
		if (forum.isClosed()) {
			throw new IllegalStateException("Forum is closed.");
		}
		
		...
		
		this.forumId = forum.id;
		this.subject = subject;
		this.author = author;
	}
	...
}
На уровне приложения тогда будет так

Код: Выделить всё

...
discussion = new Discussion(forum, subject, author);
this.discussionRepository().save(discussion);
...
Обратите внимание, что несмотря на то, что внутрь Discussion передается Forum, Discussion не хранит Forum внутри себя, а сохраняет только его идентификатор. Discussion использует объект Forum исключительно с целью проверить некие инварианты. В данном случае закрыт форум или нет.

Хочу услышать ваше мнение, какой подход вам ближе и почему.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Доменная модель.

Сообщение anton_z »

Я придерживаюсь такого мнения: конструкторы должны быть чистыми: https://www.yegor256.com/2015/05/07/cto ... -free.html.
Я думаю, что вызывая конструктор, мы создаем как бы ссылку на какое-то отложенное поведение + данные к нему. Поведение это будет исполнено позже при вызове методов. Так что я за оригинальный вариант.
skynin
Сообщения: 400
Зарегистрирован: 2017.12.12, 10:09

Re: Доменная модель.

Сообщение skynin »

-- У Вон Вернона
обратите внимание на Latest commit on 9 Apr 2013

по моим впечатлениям DDD уже выходит с моды в энтерпрайзе на Java/.NET
кратко - потому что слишком академичная.

и несет в себе главный изъян прямого понимания ООП.

практика же показывает что
- не надо проектировать классы в коде как классы домена.
- не надо пытаться переложить спецификации домена напрямую в код.
- не надо делать вид что мы пишем некоем DSL.

Лобовой подход "DDD"(в кавычках потому что этот подход стар, DDD во многом просто пересказ старых идей, 90ых годов и ранее) приводит к негибким, тяжеловестным в развитии системам.
Бизнес логика - обязательно изменится. И тогда придется - мучительно костылить вокруг этой теоритеческой красотени.

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

Re: Доменная модель.

Сообщение sda »

anton_z, Егор пишет про вычисления внутри конструктора с последующим сохранением результатов в состояние объекта. Здесь нет подобных вычислений, только ассерты не позволяющие создать объект если нарушаются инварианты. В этом отношении особых различий нет. Примеры Вон Вернона также это используют. Скорее интересует, сам способ мыслить о доменной модели.

1. Форум порождает дисскусию.
2. Дисскусия порождается к форуму.

Это варианты одного и того же, но с подходом с противоположных сторон. Это чем-то напоминает активный и пассивный залог в русском/английском языках. Мы одну и ту же мысль можем выразить как в активном залоге, так и в пассивном. Вопрос больше про это и соответственно его влияние на конечный код. Кому-то может показаться нелогичным, что форум порождает дисскусию, а затем вместо того чтобы держать её внутри себя, как принято в агрегатах, он возвращает её в мир, а кому-то наоборот, так как именно таким образом устроены отношения родитель-ребенок. Для меня лично, 1 вариант в этом отношении наверное предпочтительнее, за исключением того что туда прокидывают сервис aForumIdentityService. Это ломает всю стройную картину.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Доменная модель.

Сообщение anton_z »

sda писал(а): 2020.02.29, 21:17 Скорее интересует, сам способ мыслить о доменной модели.

1. Форум порождает дисскусию.
2. Дисскусия порождается к форуму.

Это варианты одного и того же, но с подходом с противоположных сторон. Это чем-то напоминает активный и пассивный залог в русском/английском языках. Мы одну и ту же мысль можем выразить как в активном залоге, так и в пассивном. Вопрос больше про это и соответственно его влияние на конечный код. Кому-то может показаться нелогичным, что форум порождает дисскусию, а затем вместо того чтобы держать её внутри себя, как принято в агрегатах, он возвращает её в мир, а кому-то наоборот, так как именно таким образом устроены отношения родитель-ребенок. Для меня лично, 1 вариант в этом отношении наверное предпочтительнее, за исключением того что туда прокидывают сервис aForumIdentityService. Это ломает всю стройную картину.

Я для себя сделал вывод, что такой способ распределения поведения (на основе словесности. т. н. текстологический анализ) лучше стараться не применять. Текстологический анализ годен для определения того, какие сущности нужно создать (названия классов) и их атрибутов, но для поведения это не очень.

Для определения, какой класс наделить поведением лучше пользоваться HighCohesion/Low coupling: у какого класса есть необходимая для создания обсуждения информация? У Forum. Ok. Может ли жестакая связь с классом Discussion (оператор new) в классе Forum создать проблемы с изменением? Нет, не может, так как не планируется создание иерархии наследования с Discussion, внедрения каких-либо зависимостей или конфигурации в конструктор Discussion. Вывод: поведение по созданию экземпляров Discussion можно определить в класс Forum. Как-то так.
anton_z
Сообщения: 483
Зарегистрирован: 2017.01.15, 15:01

Re: Доменная модель.

Сообщение anton_z »

skynin писал(а): 2020.02.29, 20:36 -- У Вон Вернона
обратите внимание на Latest commit on 9 Apr 2013

по моим впечатлениям DDD уже выходит с моды в энтерпрайзе на Java/.NET
кратко - потому что слишком академичная.

и несет в себе главный изъян прямого понимания ООП.

практика же показывает что
- не надо проектировать классы в коде как классы домена.
- не надо пытаться переложить спецификации домена напрямую в код.
- не надо делать вид что мы пишем некоем DSL.

Лобовой подход "DDD"(в кавычках потому что этот подход стар, DDD во многом просто пересказ старых идей, 90ых годов и ранее) приводит к негибким, тяжеловестным в развитии системам.
Бизнес логика - обязательно изменится. И тогда придется - мучительно костылить вокруг этой теоритеческой красотени.

Не говоря о том что персистентные хранилища данных фундаментально далеки от ОО представления данных.
Согласен абсолютно. Под всеми пунктами подписываюсь. В ООП свои правила написания кода, для формирования домена действуют другие правила. Они разные.
Ответить