powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / DDD разнесение кода логики по классам
169 сообщений из 169, показаны все 7 страниц
DDD разнесение кода логики по классам
    #39910070
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то не интуитивно, часть логики в корне агрегации, часть не там?
А как там разруливается, например, что есть уже такой агрегат? Уникальность в БД. Где это должно быть?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910078
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach,

логики агрегатах быть не должно. ни в корне, ни в сущностях.
уникальность DDD не поддерживает, она описывается отдельно, вариантов масса.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910081
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
love_bach,

логики агрегатах быть не должно. ни в корне, ни в сущностях.
уникальность DDD не поддерживает, она описывается отдельно, вариантов масса.

Насчёт первого - поясни. Также даже методы предполагаются
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910082
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach,

DDD не описывает где вам хранить вашу логику
но для DDD лучше всего подходит паттерн CQRS

вы конечно можете логику разместить в классах, которые моделируют сущности и агрегаты
практика показывает, что такой подход неэффективен

используя CQRS, любое изменение производится с помощью команд
с помощью отдельных запросов вы можете вытаскивать проекции данных, но не сами сущности или агрегаты

по сути, единственный способ достать агрегат, это вытащить его по ID
единственный способ создать, изменить или удалить агрегат, это выполнить команду

команда это не любая логика вообще, это конкретно внесение изменений в систему

бизнес-логика при этом размещается в службах и сервисах
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910117
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
love_bach,

DDD не описывает где вам хранить вашу логику
но для DDD лучше всего подходит паттерн CQRS

вы конечно можете логику разместить в классах, которые моделируют сущности и агрегаты
практика показывает, что такой подход неэффективен

используя CQRS, любое изменение производится с помощью команд
с помощью отдельных запросов вы можете вытаскивать проекции данных, но не сами сущности или агрегаты

по сути, единственный способ достать агрегат, это вытащить его по ID
единственный способ создать, изменить или удалить агрегат, это выполнить команду

команда это не любая логика вообще, это конкретно внесение изменений в систему

бизнес-логика при этом размещается в службах и сервисах


спасибо!
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910374
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

DDD не описывает где вам хранить вашу логику
но для DDD лучше всего подходит паттерн CQRS

вы конечно можете логику разместить в классах, которые моделируют сущности и агрегаты
практика показывает, что такой подход неэффективен

используя CQRS, любое изменение производится с помощью команд
с помощью отдельных запросов вы можете вытаскивать проекции данных, но не сами сущности или агрегаты

по сути, единственный способ достать агрегат, это вытащить его по ID
единственный способ создать, изменить или удалить агрегат, это выполнить команду

команда это не любая логика вообще, это конкретно внесение изменений в систему

бизнес-логика при этом размещается в службах и сервисах

очередной поток сознания от местного "эксперда", нагугленные умные слова сваленные в кучу без малейшей попытки осмысления и опыта практического использования
CQRS напрямую к DDD вообще не относится, это разные вещи и идея использовать CQRS только потому, что используется DDD может родится только в воспаленном гуглом уме. CQRS нужен когда модели для чтения начинают разнится с моделями для изменения, также изоляция чтения позволяет маштабировать ее независимо от записи и прочее, все это обусловлено требованиями к конкретной системе, а никак не использованием DDD
А бизнес-логика в классическом DDD как раз расположена в сущностях, вынесение ее в отдельные классы сервисов будет уже называться анемичной моделью и не являтся DDD как таковой. "Практика" у него показывает что это неэффективно Для фриланс интернет-магазина по продаже валенок или студенческого проекта - возможно, а в коммерческих проектах люди сначала анализируют требования к системе, а уже потом принимают решения

love_bachКак-то не интуитивно, часть логики в корне агрегации, часть не там?
А как там разруливается, например, что есть уже такой агрегат? Уникальность в БД. Где это должно быть?

за уникальность отвечает владелец данных (т.е. база), к функциям DDD это не относится
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910376
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
А бизнес-логика в классическом DDD как раз расположена в сущностях


Пруф будет?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910377
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
"Практика" у него показывает что это неэффективно
Для фриланс интернет-магазина по продаже валенок или студенческого проекта - возможно, а в коммерческих проектах люди сначала анализируют требования к системе, а уже потом принимают решения


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

Поэтому не обижаюсь, пруф только дайте на ваше интересное утверждение.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910378
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кому действительно интересно как используется CQRS вместе с DDD, можете ознакомиться со следующими материалами:

Применение в микрослужбе упрощенных шаблонов CQRS и DDD

Сайт, посвящённый этой теме

Довольно активный форум


От себя же, не рекомендую делать вот так:

stenford
А бизнес-логика в классическом DDD как раз расположена в сущностях, вынесение ее в отдельные классы сервисов будет уже называться анемичной моделью и не являтся DDD как таковой.


Потому что даже такое поделие, как

stenford
фриланс интернет-магазина по продаже валенок или студенческого проекта


обойдётся вам дорого, либо это будет лишь наивным намёком на то, что авторы пытались в DDD, но не коня корм.

Но этого хватает, как видно, чтобы включить гонор на все 146%
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910379
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вспомнил ещё есть интересная статья на эту тему, нашёл перевод на хабре Анемичная модель предметной области — не анти-шаблон, а архитектура по принципам SOLID

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

Что вообще-то нисколько не умаляет и не противоречит ООП. Просто его понимали и готовили неправильно.

Основная и ключевая ошибка состоит в том, что под Объектами в ООП понимались объекты реального мира. Откройте любую книжку времён 2000-х. Там обязательно будут примеры с животными или геометрическими фигурами. Но ООП это не про реальный мир. Он для этого вообще не подходит. Совершенно.

Соответственно, пытаться инкапсулировать предметную область сущности/агрегата в одном месте (в классе) -- это неправильно. Более того, это очень плохо, и ведёт к печальным последствиям.

Сегодня подобный подход можно приравнять к говнокоду. Потому что нарушает SOLID, плохо тестируется, таки получает прямую зависимость не только от способа хранения, но и самих языковых средств.

Называть модель предметной области анемичной в сущности неправильно. Никакой анемии нет, логики много, она часто меняется, и не редко пересекает Bounded Context, -- ну вот такой он суровый реальный мир.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910380
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Пруф будет?


Читай базовую теорию , потом будешь делиться опытом своего интернет магазина по продаже валенок
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910381
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
hVostt

Пруф будет?


Читай базовую теорию , потом будешь делиться опытом своего интернет магазина по продаже валенок


и где тут пруф-то?
дядька написал это в 2003 году, 17 лет назад

собственно, опровержение этой же статьи выше опубликовал, хотя оно не требуется
давно уже очевидно, что рич модель не жизнеспособна, ни в DDD ни в чём-либо ещё
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910382
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Вспомнил ещё есть интересная статья на эту тему, нашёл перевод на хабре Анемичная модель предметной области — не анти-шаблон, а архитектура по принципам SOLID

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

о, гляжу нагугл что такое анемика, целый час тебе на потребовался

hVostt

Что вообще-то нисколько не умаляет и не противоречит ООП. Просто его понимали и готовили неправильно.
Основная и ключевая ошибка состоит в том, что под Объектами в ООП понимались объекты реального мира. Откройте любую книжку времён 2000-х. Там обязательно будут примеры с животными или геометрическими фигурами. Но ООП это не про реальный мир. Он для этого вообще не подходит. Совершенно.

Да, Эрик Эванс и Мартин Фаулер все делали неправильно, а вот млять хвост тут оказывается авторитет в мире ООП
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910383
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
Да, Эрик Эванс и Мартин Фаулер все делали неправильно, а вот млять хвост тут оказывается авторитет в мире ООП


всё они делают правильно
пишут статьи, исследуют, многие заметки успели устареть

а ты нет, мало того, что несёшь ахинею
так ещё и единственный "пруф" нагуглил, это статья 17-летней давности, в которой автор обижается, что люди не хотят делать DDD, как ему кажется правильно, но не примеров, ни доказательств успешности такого подхода до сих нет
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910384
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

и где тут пруф-то?
дядька написал это в 2003 году, 17 лет назад

собственно, опровержение этой же статьи выше опубликовал, хотя оно не требуется
давно уже очевидно, что рич модель не жизнеспособна, ни в DDD ни в чём-либо ещё

Опровержение? Чей-то бложик?
И мой поинт кстати был совсем не в том, что правильно, а что нет, а в том, что классический ООП именно с рич моделью, если у кого-то не получается его готовить - то так и надо говорить, либо по крайней мере в топике DDD упоминать что следуешь секте анемиков, а не говоришь про DDD как таковое
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910385
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford,

да, кстати, поржал про "базовую теорию"
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910386
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
Опровержение? Чей-то бложик?

И мой поинт кстати был совсем не в том, что правильно, а что нет, а в том, что классический ООП именно с рич моделью, если у кого-то не получается его готовить - то так и надо говорить, либо по крайней мере в топике DDD упоминать что следуешь секте анемиков, а не говоришь про DDD как таковое


с тобой как с табуреткой разговаривать

какая ещё секта?
разумные мысли от тебя вообще сегодня будут?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910387
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
что классический ООП именно с рич моделью


откуда вообще у тебя в голове этот мусор?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910388
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

да, кстати, поржал про "базовую теорию"

Ясно, того-же Эрика Эванса значит не читал, образование в гугле получил по подобным бложикам, что в принципе прекрасно видно по уровню твоих познаний, и для тех кто в танке повторю - это и есть классический DDD. Анемика родилась примерно в те-же времена, и так никуда и не взлетела за пределами холиваров и форумских дурачков типа тебя, которые вычитав новое слово бросаются его имплементировать в свой магазинчик.
ООП устарело у него
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910389
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford,

Выраженное понятие может родилось. Самой "анемике" ровно столько же, сколько существует разработка ПО вообще. Эрик Эванс где говорил, что логика DDD должно быть выражено в классах сущностей и полностью инкапсулировать там логику? Каким образом вынесение логики в службы противоречит ООП, DDD, Фаулеру или Эвансу?

Мне пока понятно одно, ты пытаешься что-то сказать, но выразить это разумными словами не можешь.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910390
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
форумских дурачков типа тебя, которые вычитав новое слово бросаются его имплементировать в свой магазинчик


Видимо у тебя какое-то заболевание. В чём-то разобраться и предметно подискутировать тебе не интересно, основная цель, мелко подобосрать. Зачем тебе это, ребёнок? )
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910391
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Выраженное понятие может родилось. Самой "анемике" ровно столько же, сколько существует разработка ПО вообще. Эрик Эванс где говорил, что логика DDD должно быть выражено в классах сущностей и полностью инкапсулировать там логику? Каким образом вынесение логики в службы противоречит ООП, DDD, Фаулеру или Эвансу?

ты ссылку которую я дал прочитал вообще? Там текста не так и много, все прекрасно видно кто и что говорил. Переведи в гугле если английский не понимаешь
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910392
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
ты ссылку которую я дал прочитал вообще? Там текста не так и много, все прекрасно видно кто и что говорил. Переведи в гугле если английский не понимаешь


Я её читал ещё когда ты под стол пешком ходил.

Значит эта статья и есть тот догмат, на котором опирается твой выбор для архитектуры?
Или просто это тупо всё, что ты нагуглил?

Если так, на каком основании из тебя так мощно говно потекло?
Что с тобой не так?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910393
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Я её читал ещё когда ты под стол пешком ходил.

Значит эта статья и есть тот догмат, на котором опирается твой выбор для архитектуры?
Или просто это тупо всё, что ты нагуглил?

Если так, на каком основании из тебя так мощно говно потекло?
Что с тобой не так?

ух ну ты и тупой, на твой вопрос "Эрик Эванс где говорил, что логика DDD должно быть выражено в классах сущностей" там есть прямые цитаты от Эванса где это написано, плюс разжевано Фаулером, если даже в такой форме до тебя это не доходит, то подобную узколобость даже лоботомией вылечить уже нельзя
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910394
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
ух ну ты и тупой, на твой вопрос "Эрик Эванс где говорил, что логика DDD должно быть выражено в классах сущностей" там есть прямые цитаты от Эванса где это написано, плюс разжевано Фаулером, если даже в такой форме до тебя это не доходит, то подобную узколобость даже лоботомией вылечить уже нельзя


Эрик говорит про слои (или уровни) архитектуры, а не про ООП или классы.
В его книге об этом чётко и подробно расписано.

stenford
подобную узколобость даже лоботомией вылечить уже нельзя


Ты в реале такое же упоротое быдло, или только тут так себя по-свински ведёшь?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910396
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Эрик говорит про слои (или уровни) архитектуры, а не про ООП или классы.
В его книге об этом чётко и подробно расписано.

мда, у тебя отсутствуют совершенно базовые знания о разработке, уровни, про которые он говорит как раз и содержат в том числе доменные сущности, которые и обладают логикой (последняя цитата по ссылке там напрямую их упоминает), если-бы ты узнал об этой книжке не сегодня из этого топика, а хотя-бы слышал о ней в прошлом, то этого чудовищного бреда бы не нес, обычно даже джуны более подкованы в базовой теории, я честно говоря не разу не видел джуна, который обладал-бы насколько извращенным пониманием ООП

hVostt

Ты в реале такое же упоротое быдло, или только тут так себя по-свински ведёшь?

с уродцами типа тебя по другому нельзя, ты человеческого языка в принципе не понимаешь
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910423
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
мда, у тебя отсутствуют совершенно базовые знания о разработке, уровни, про которые он говорит как раз и содержат в том числе доменные сущности, которые и обладают логикой (последняя цитата по ссылке там напрямую их упоминает), если-бы ты узнал об этой книжке не сегодня из этого топика, а хотя-бы слышал о ней в прошлом, то этого чудовищного бреда бы не нес, обычно даже джуны более подкованы в базовой теории, я честно говоря не разу не видел джуна, который обладал-бы насколько извращенным пониманием ООП


По сути ничего нет и не было с самого начала.
Откопал статью времён мамонта, вместо какой-либо аргументации.
Чисто детское авторитарное мышление "потому что он так сказал".

В то же самое время и много позже было высказано множество других идей, мыслей и исследований по этой теме, которые не поддерживают подобную точку зрения.

И я не утверждал, что только вот так и никак иначе правильно, а делился своими соображениями и опытом, для этого форум и существует.

stenford
с уродцами типа тебя по другому нельзя, ты человеческого языка в принципе не понимаешь


По твоей манере разговаривать, ты обыкновенная второсортная свинья и упоротое быдло. И по-человечески разговаривать в принципе не умеешь. Скорее всего ты чем-то обижен на меня. И думаю, что поделом.

Ну и с новым годом тебя, ты жалок.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910426
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttлогики агрегатах быть не должно. ни в корне, ни в сущностях.
hVostt
Кому действительно интересно как используется CQRS вместе с DDD, можете ознакомиться со следующими материалами:

Применение в микрослужбе упрощенных шаблонов CQRS и DDD



Там как раз написано:

авторВ рамках DDD изменять сущность желательно только с помощью методов самой сущности

И пример класса, в котором видно, что модель имеет логику, следственно это не анемичная сущность.
И в целом, там не рекомендуют анемик, а как раз логику в агрегатах.

автор
Код: c#
1.
2.
3.
4.
5.
6.
public class Order : Entity, IAggregateRoot
{
    public void AddOrderItem(int productId, string productName,
                            decimal unitPrice, decimal discount,
                            string pictureUrl, int units = 1)
    {




https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/microservice-domain-model

авторHowever, if you need to tackle the complexity of a microservice’s domain that has a lot of ever-changing business rules, the anemic domain model might be an anti-pattern for that microservice or Bounded Context. In that case, designing it as a rich model with entities containing data plus behavior as well as implementing additional DDD patterns (aggregates, value objects, etc.) might have huge benefits for the long-term success of such a microservice.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910428
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v,

Всё верно :)

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

Из полученного опыта могу сказать, что несмотря на красоту изначальной идеи, на практике почти никаких плюсов в инкапсуляции логики в классы сущностей и агрегатов нет. А минусов вагон.

Ситуаций, когда это действительно может принести профит прям ничтожно мало.

Если убрать это требование, никаких противоречий нет. Так называемая "анемичность" это искусственный термин, и довольно странный. Никаких проблем нет в реализации всех артефактов из DDD, включая полноценный ubiquitous language без необходимости городить чудовище из классов модели.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910438
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v,

Для примера можно рассмотреть вот этот код

https://github.com/dotnet-architecture/eShopOnContainers/blob/7b300ec91244bf44bf82372389d362a98c2da8b6/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommandHandler.cs

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands
{
    using Domain.AggregatesModel.OrderAggregate;
    using global::Ordering.API.Application.IntegrationEvents;
    using global::Ordering.API.Application.IntegrationEvents.Events;
    using MediatR;
    using Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Services;
    using Microsoft.eShopOnContainers.Services.Ordering.Infrastructure.Idempotency;
    using Microsoft.Extensions.Logging;
    using System;
    using System.Threading;
    using System.Threading.Tasks;

    // Regular CommandHandler
    public class CreateOrderCommandHandler
        : IRequestHandler<CreateOrderCommand, bool>
    {
        private readonly IOrderRepository _orderRepository;
        private readonly IIdentityService _identityService;
        private readonly IMediator _mediator;
        private readonly IOrderingIntegrationEventService _orderingIntegrationEventService;
        private readonly ILogger<CreateOrderCommandHandler> _logger;

        // Using DI to inject infrastructure persistence Repositories
        public CreateOrderCommandHandler(IMediator mediator,
            IOrderingIntegrationEventService orderingIntegrationEventService,
            IOrderRepository orderRepository,
            IIdentityService identityService,
            ILogger<CreateOrderCommandHandler> logger)
        {
            _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository));
            _identityService = identityService ?? throw new ArgumentNullException(nameof(identityService));
            _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
            _orderingIntegrationEventService = orderingIntegrationEventService ?? throw new ArgumentNullException(nameof(orderingIntegrationEventService));
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
        }

        public async Task<bool> Handle(CreateOrderCommand message, CancellationToken cancellationToken)
        {
            // Add Integration event to clean the basket
            var orderStartedIntegrationEvent = new OrderStartedIntegrationEvent(message.UserId);
            await _orderingIntegrationEventService.AddAndSaveEventAsync(orderStartedIntegrationEvent);

            // Add/Update the Buyer AggregateRoot
            // DDD patterns comment: Add child entities and value-objects through the Order Aggregate-Root
            // methods and constructor so validations, invariants and business logic 
            // make sure that consistency is preserved across the whole aggregate
            var address = new Address(message.Street, message.City, message.State, message.Country, message.ZipCode);
            var order = new Order(message.UserId, message.UserName, address, message.CardTypeId, message.CardNumber, message.CardSecurityNumber, message.CardHolderName, message.CardExpiration);

            foreach (var item in message.OrderItems)
            {
                order.AddOrderItem(item.ProductId, item.ProductName, item.UnitPrice, item.Discount, item.PictureUrl, item.Units);
            }

            _logger.LogInformation("----- Creating Order - Order: {@Order}", order);

            _orderRepository.Add(order);

            return await _orderRepository.UnitOfWork
                .SaveEntitiesAsync(cancellationToken);
        }
    }


    // Use for Idempotency in Command process
    public class CreateOrderIdentifiedCommandHandler : IdentifiedCommandHandler<CreateOrderCommand, bool>
    {
        public CreateOrderIdentifiedCommandHandler(
            IMediator mediator,
            IRequestManager requestManager,
            ILogger<IdentifiedCommandHandler<CreateOrderCommand, bool>> logger)
            : base(mediator, requestManager, logger)
        {
        }

        protected override bool CreateResultForDuplicateRequest()
        {
            return true;                // Ignore duplicate requests for creating order.
        }
    }
}



Это команда для создания заказа.
Здесь мы видим DDD и CQRS в чистом виде.
Почти.

Особенности ООП и конкретных языковых средств не дают возможности провести эту операцию исключительно на уровне DDD.

Если отказаться от CQRS и команд, где разместить код создания заказа?

Как видим, это целый комплекс различных операций, относящихся как бизнес-логике, так и к инфраструктуре. Это работа с репозиторием, публикация событий, и сохранение через UOW.

Конструктор использовать нельзя, так как во-первых, он не может быть асинхронным, во-вторых логика в конструкторе -- зло, в третьих, DDD должен быть отстранён от деталей реализации, от хранилища, событийной системы и т.д. Хотя следуюя принципам ООП, именно конструктор является самым лучшим местом для реализации создания и конструирования экземпляра предметной области, чтобы поддерживать свой инвариант.

Тогда нам понадобится что-то вроде фабрики. Ну а это уже ни что иное, как сервис.

Далее. А что делать, если поддержать полностью валидный инвариант при изоляции на уровне агрегата нельзя? Именно так чаще всего и бывает. Значит в экземпляр агрегата необходимо прокинуть полный доступ хотя бы к ограниченному контексту. Задача далеко не из простых, сделать это органично и не нарушая парочку известных принципов разработки.

Далее. А что делать, если нам нужна операция, затрагивающая несколько агрегатов, в которой сложно чётко выделить явный корень агрегата операции? Например, создание резерва при создании заказа, с обеспечением гарантии оплаты из спектра возможных гарантов (депозит, блокировка суммы, гарантийное письмо и т.д.). В каком агрегате будет красивый заветный метод?

Далее. А что делать, когда подключили интеграцию с партнёром и он грузит такие заказы огромными пачками, десятки, сотни тысяч за раз, и партнёров много становится. И профилирование показывает жестойшее узкое место в этой команде? И ничего поделать нельзя, нельзя трогать DDD.

Далее. Ну а как же протестировать вот именно эту команду? Без учёта логики, инкапсулированной в домен (order.AddOrderItem)? Никак, ведь это классы, а не интерфейсы. Да ещё и экземпляры создаются через конструктор. Выходом может быть запрет использования конструкторов, и требование помечать публичные методы сущностей как virtual. Это позволит решить задачу, но какой ценой!

Далее. Мы видим вот такой код:

Код: c#
1.
2.
     var address = new Address(message.Street, message.City, message.State, message.Country, message.ZipCode);
     var order = new Order(message.UserId, message.UserName, address, message.CardTypeId, message.CardNumber, message.CardSecurityNumber, message.CardHolderName, message.CardExpiration);



Выглядит приятно. На первый взгляд. До первых требований от бизнеса. До первого рефакторинга. Внести изменения в адрес теперь безумно дорого, даже если изменения будут обратно совместимыми. Чтобы безболезненно расширить сущность, необходимо будет создать новых констуркторов. Что очень вредит DDD, теперь преимущества единого языка уже не выглядят такими замечательными, на фоне того, когда у вас несколько вариантов сделать одно и то же, так какой же нужно использовать?

Можно и дальше продолжать, взять другие примеры.
Как ни крути, логика будет размазана, ООП здесь не всегда работает. Изоляция очень примитивная и больше мешает, чем помогает.

Как исправить?

  • Убираем логику изменения из моделей, и переносим в команды, а бизнес-логику в службы/сервисы, -- при чём, желательно не нарушать принципы разработки ПО, делать сервисы узко специализированными.
  • На уровне команд и только в них вносятся изменения домен: создаются, изменяются классы агрегатов и сущностей, контролируются инварианты, проводятся саги и т.д.
  • Команда может выполнить свою задачу как угодно, в том числе и через внесение изменений наиболее оптимальным образом, не нарушая никаких принципов и не попирая ни чьи идеи.
  • Команда может контролировать инварианты более широко и глубоко, обращаться к любым внутренним и внешним сервисам, выполнять запросы, создавать вложенные команды, таким образом поддерживается декомпозиция логики.
  • Можно создавать новые команды, не внося изменений в домен, что прям очень хорошо.
  • Не нужно выдавливать из ООП то, для чего он не был изначально создан, и жить с ограничениями реализации ООП конкретного языка.
  • Не нужно зависить от языковых средств. Один и тот же подход прекрасно может быть реализован на различных языках.
  • Теперь позволительно шарить логику домена для уровня презентации, например, валидацию.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910447
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё дополню. В таком варианте исполнения, значительно вырастает роль UOW в системе.

В приведённом примере коммитится только сохранение данных в хранилище, что не делает всю операцию строго атомарной. Выпуск событий может быть только в случае успешного выполнения и завершения операции. Потом захочется сохранять ещё и сами успешные команды в некое хранилище. А если мы используем EventSourcing, нам понадобится особый класс событий и хранилище этих событий, которое уже, на минуточку, является хранилищем мастер данных. Хорошо бы иметь возможность выполнить серию команд в одной транзакции и получить полностью согласованный результат. Не хотелось бы разруливать заморочки с блокировками на уровне команд.

В итоге, сохранение UOW лучше вынести за пределы команды. Все события, изменения данных и команды, которые инициировали изменения, записываются в UOW. При сохранении, всё персистится, события публикуются, а на выходе мы получаем согласованный, стабильный и ожидаемый результат.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910449
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttКонструктор использовать нельзя, так как во-первых, он не может быть асинхронным, во-вторых логика в конструкторе -- зло
Сложной логики с участием IO там быть не должно, в для простой асинхронность не нужна.

hVosttА что делать, если поддержать полностью валидный инвариант при изоляции на уровне агрегата нельзя?
Тут не понял.

hVosttА что делать, если нам нужна операция, затрагивающая несколько агрегатов, в которой сложно чётко выделить явный корень агрегата операции?
А что будет если не совсем правильно выделить корень? Ничего страшного имхо, мелкий рефакторинг на край.

hVostt А что делать, когда подключили интеграцию с партнёром и он грузит такие заказы огромными пачками, десятки, сотни тысяч за раз, и партнёров много становится. И профилирование показывает жестойшее узкое место в этой команде?
Это может быть с любым методом, любого класса, каждый случай нужно рассматривать отдельно.

hVosttНу а как же протестировать вот именно эту команду? Без учёта логики, инкапсулированной в домен (order.AddOrderItem)?
Тестировать отдельно класс Order, через метод GetTotal() например, в чем тут проблема?

В целом не вижу особых проблем с указанной командой.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910450
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt
Хорошо бы иметь возможность выполнить серию команд в одной транзакции и получить полностью согласованный результат.


Не факт, что CQRS подходит для большого количества зависимых операций.

Фаулер писал на эту тему:
авторLike any pattern, CQRS is useful in some places, but not in others. Many systems do fit a CRUD mental model, and so should be done in that style.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910474
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford

очередной поток сознания от местного "эксперда", нагугленные умные слова сваленные в кучу без малейшей попытки осмысления и опыта практического использования

так приведите конкретный пример хорошего использования DDD, только не пет проект, высосанный из пальца, а реально сложную предметную область, банки там, страхование или типа того, мне правда очень хочется посмотреть как использовать DDD, чтоб не наступить на тыщу граблей и чтоб сохранить солид и не делать god-объектов

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

а от сторонников я только и слышу - "не умеешь правильно готовить", ну так покажите как надо
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910479
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
очередной поток сознания от местного "эксперда", нагугленные умные слова сваленные в кучу без малейшей попытки осмысления и опыта практического использования

у hVostt хотя бы есть несколько лет разработки проекта на CQRS + ES с нуля
а у вас что есть, кроме какашек для вентилятора?
Можно и повежливее в топики врываться, коли не обезьяна
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910496
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

По сути ничего нет и не было с самого начала.
Откопал статью времён мамонта, вместо какой-либо аргументации.
Чисто детское авторитарное мышление "потому что он так сказал".

В то же самое время и много позже было высказано множество других идей, мыслей и исследований по этой теме, которые не поддерживают подобную точку зрения.

И я не утверждал, что только вот так и никак иначе правильно, а делился своими соображениями и опытом, для этого форум и существует.


т.е. дошло наконец что классический DDD из себя представляет? Сутки потребовались, Эрик Эванс у него такого не говорил, конечно если ты это имя только вчера услышал. Если речь про DDD идет, то писать бредятину про то, что DDD не указывает где логику хранить - нельзя. А идей всегда много разных высказывается, но в отличие от тебя я не хватаю первую понравившуюся идею, не возвожу ее в абсолют и не начинаю гнать пугру о том что правильно во всех случаях, а что нет. ООП у него оказывается приравнивается к говнокоду А мое личное мнение об анемике совпадает с Фаулеровской, в большинстве случаев анемику лепят т.к. просто отсутствует квалификация собрать правильный ООП
А повторять холивар 10-летней давности, и особенно с типами типа тебя, не знающими даже базовую теорию, предоставлю другим.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910497
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77

так приведите конкретный пример хорошего использования DDD, только не пет проект, высосанный из пальца, а реально сложную предметную область, банки там, страхование или типа того, мне правда очень хочется посмотреть как использовать DDD, чтоб не наступить на тыщу граблей и чтоб сохранить солид и не делать god-объектов

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

а от сторонников я только и слышу - "не умеешь правильно готовить", ну так покажите как надо

у нас как раз банки, и ничего. Понятно что на практике всегда приходится идти на компромисы, но это не повод теперь выкинуть всю логику в сервисы и превратить ее в неподдерживаемую лапшу
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910498
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух

у hVostt хотя бы есть несколько лет разработки проекта на CQRS + ES с нуля
а у вас что есть, кроме какашек для вентилятора?
Можно и повежливее в топики врываться, коли не обезьяна

он там на нуле и остался, от того, что обычно пишет этот чувак на форуме волосы дыбом встают, и этот топик хороший пример
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910523
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
17-77

так приведите конкретный пример хорошего использования DDD, только не пет проект, высосанный из пальца, а реально сложную предметную область, банки там, страхование или типа того, мне правда очень хочется посмотреть как использовать DDD, чтоб не наступить на тыщу граблей и чтоб сохранить солид и не делать god-объектов

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

а от сторонников я только и слышу - "не умеешь правильно готовить", ну так покажите как надо

у нас как раз банки, и ничего. Понятно что на практике всегда приходится идти на компромисы, но это не повод теперь выкинуть всю логику в сервисы и превратить ее в неподдерживаемую лапшу

Кто-то там вам неподдерживаемой лапши понаписал, и вы теперь на форуме злобу вымещаете?
Очень на это смахивает.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910531
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot stenford#22052774
мда, у тебя отсутствуют совершенно базовые знания о разработке, уровни, про которые он говорит как раз и содержат в том числе доменные сущности, которые и обладают логикой (последняя цитата по ссылке там напрямую их упоминает), если-бы ты узнал об этой книжке не сегодня из этого топика, а хотя-бы слышал о ней в прошлом, то этого чудовищного бреда бы не нес, обычно даже джуны более подкованы в базовой теории, я честно говоря не разу не видел джуна, который обладал-бы насколько извращенным пониманием ООП
с уродцами типа тебя по другому нельзя, ты человеческого языка в принципе не понимаешь[/quot]

Практика показывает, что если юзер образован, то у него и с грамматикой и орфографией все в порядке.
Такой "резкий" "джуна" юзер, а так безграмотно пишет.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910604
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
hVosttКонструктор использовать нельзя, так как во-первых, он не может быть асинхронным, во-вторых логика в конструкторе -- зло

Сложной логики с участием IO там быть не должно, в для простой асинхронность не нужна.

В конструкторе конечно логики быть не должно.
Но при создании агрегата сложная логика часто присутствует, асинхронность нужна, так как могут потребоваться данные из контекста.
Поэтому конструктор плохо подходит для создания агрегата. Создать экземпляр класса -- вот его задача.


Hexag0v
hVosttА что делать, если поддержать полностью валидный инвариант при изоляции на уровне агрегата нельзя?

Тут не понял.

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

По опыту таких сложных и даже где-то не очень логичных правил у бизнеса накапливается огромное количество. Абсолютно невозможно учесть всё это на уровне проектирования модели. Только если вы не создаёте ПО по ТЗ под ключ -- а так сейчас никто не разрабатывает.


Hexag0v
hVosttА что делать, если нам нужна операция, затрагивающая несколько агрегатов, в которой сложно чётко выделить явный корень агрегата операции?

А что будет если не совсем правильно выделить корень? Ничего страшного имхо, мелкий рефакторинг на край.

Речь не в правильности или неправильности. А в потере логики и смысла, что очень вредит и доменной модели, и единому языку. Кроме того, разработчика должно как можно меньше парить вопросы, где и как ему размещать логику. Признак хорошей архитектуры это сведение таких вопросов к минимуму.


Hexag0v
hVostt А что делать, когда подключили интеграцию с партнёром и он грузит такие заказы огромными пачками, десятки, сотни тысяч за раз, и партнёров много становится. И профилирование показывает жестойшее узкое место в этой команде?

Это может быть с любым методом, любого класса, каждый случай нужно рассматривать отдельно.

Ну так вы и не ответили на вопрос.

-- А что, если у пациента горло болит?
-- Такое может с каждым произойти. Надо рассматривать каждый случай отдельно.

Понятно, что универсального решения нет. Но у Фаулеровского (от 2013 года) DDD никакого решения на этот счёт нет. Выкручивайтесь сами так сказать.


Hexag0v
hVosttНу а как же протестировать вот именно эту команду? Без учёта логики, инкапсулированной в домен (order.AddOrderItem)?

Тестировать отдельно класс Order, через метод GetTotal() например, в чем тут проблема?

В целом не вижу особых проблем с указанной командой.

Я не настаиваю, но я вижу здесь проблемы, так как лично с ними сталкивался в разработке промышленного ПО, очень крупного и дорогого. И цену этих проблем знаю не только я, но также и участники команд, с которыми работал, а также руководство.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910605
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
hVostt
Хорошо бы иметь возможность выполнить серию команд в одной транзакции и получить полностью согласованный результат.


Не факт, что CQRS подходит для большого количества зависимых операций.

Фаулер писал на эту тему:
авторLike any pattern, CQRS is useful in some places, but not in others. Many systems do fit a CRUD mental model, and so should be done in that style.


Я Фаулера уважаю. Но это не значит, что буду слепо следовать его указаниям. Нужно пользоваться также и своей головой, и на опыте далеко не всё работает по написанному.

Это очень удобная позиция, ну.. зависит от. Да, так оно и есть. Зависит. Но что делать новичкам? Откуда они знают что и от чего зависит? Как выбрать? Что делать?

Однако. Мы решили эту проблему, у нас и CRUD и сложная логика через CQRS прекрасно работают, плюс ещё EventSourcing, с которым тоже удалось решить множество проблем и вызовов.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910606
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77
а от сторонников я только и слышу - "не умеешь правильно готовить", ну так покажите как надо


Это обычный способ уйти от ответа и объяснения.
Да, вы не умеете правильно готовить
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910607
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
А повторять холивар 10-летней давности, и особенно с типами типа тебя, не знающими даже базовую теорию, предоставлю другим.


Я пока не научился разговаривать со свиньями.
Когда начнёшь разговаривать как приличный и разумный человек, пиши.
Обижаться на тебя не буду, это грешно.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910646
91145
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
17-77
а от сторонников я только и слышу - "не умеешь правильно готовить", ну так покажите как надо


Это обычный способ уйти от ответа и объяснения.
Да, вы не умеете правильно готовить

Давайте тогда так )

Проект, код из которого вы показали
Пример cqrs

На Ваш взгляд , насколько удачно там применен cqrs?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910652
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
91145
Проект, код из которого вы показали
Пример cqrs

а что в C# означает такая запись:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public class CreateOrderCommand
{
    [DataMember] // это название какого-то блока данных?
    public string UserId {get; private set;} // а это относится к C# или уже к CQRS?

    [DataMember] // и опять он?
    public string UserName {get; private set;}
};
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910682
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
91145
Давайте тогда так )

Проект, код из которого вы показали
Пример cqrs

На Ваш взгляд , насколько удачно там применен cqrs?


С точки зрения учебного примера -- довольно хорошо, легко находится то, что есть в теории.
Хорошо понятен и виден принцип, и даже полноценная его реализация. Потому как обычно отсутствие хоть какой-либо вменяемой готовой реализации к теории является серьёзной проблемой для новичков.

С практической же точки зрения -- плохо.
Когда мы хотим применить CQRS, мы это делаем, чтобы получить определённую выгоду, профит.
А не получить медальку и одобрительное похлопывание по плечу от гуру или евангелиста методики.

Здесь профита достигается мало.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910683
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
а что в C# означает такая запись:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
public class CreateOrderCommand
{
    [DataMember] // это название какого-то блока данных?
    public string UserId {get; private set;} // а это относится к C# или уже к CQRS?

    [DataMember] // и опять он?
    public string UserName {get; private set;}
};



Это атрибут для сериализации команд. Так как команды являются, и должны являться, чистыми POCO/DTO, возникает закономерное желание их куда-то сохранить. Ещё можно их направлять в единую точку обработки или в диспетчер через какую-нибудь шину команд, таким образом получить возможность более гибкого масштабирования.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910684
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а вот это почему так объявляется (get/set)? и как именно используется в CQRS?
полудух
Код: c#
1.
public string UserId {get; private set;}

...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910685
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Здесь профита достигается мало.

т.е. пример - говно?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910686
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
т.е. пример - говно?


Вообще, я ещё немного поковырялся в примере и вот что нашёл:

https://github.com/dotnet-architecture/eShopOnContainers/blob/23992ed3249cd257ac5fc42b23f2864b2ddf347b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
    public class ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler
                        : INotificationHandler<OrderStartedDomainEvent>
    {
        private readonly ILoggerFactory _logger;
        private readonly IBuyerRepository _buyerRepository;
        private readonly IIdentityService _identityService;
        private readonly IOrderingIntegrationEventService _orderingIntegrationEventService;

        public ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler(
            ILoggerFactory logger, 
            IBuyerRepository buyerRepository, 
            IIdentityService identityService,
            IOrderingIntegrationEventService orderingIntegrationEventService)
        {
            _buyerRepository = buyerRepository ?? throw new ArgumentNullException(nameof(buyerRepository));
            _identityService = identityService ?? throw new ArgumentNullException(nameof(identityService));
            _orderingIntegrationEventService = orderingIntegrationEventService ?? throw new ArgumentNullException(nameof(orderingIntegrationEventService));
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
        }

        public async Task Handle(OrderStartedDomainEvent orderStartedEvent, CancellationToken cancellationToken)
        {            
            var cardTypeId = (orderStartedEvent.CardTypeId != 0) ? orderStartedEvent.CardTypeId : 1;
            var buyer = await _buyerRepository.FindAsync(orderStartedEvent.UserId);
            bool buyerOriginallyExisted = (buyer == null) ? false : true;

            if (!buyerOriginallyExisted)
            {                
                buyer = new Buyer(orderStartedEvent.UserId, orderStartedEvent.UserName);
            }

            buyer.VerifyOrAddPaymentMethod(cardTypeId,
                                           $"Payment Method on {DateTime.UtcNow}",
                                           orderStartedEvent.CardNumber,
                                           orderStartedEvent.CardSecurityNumber,
                                           orderStartedEvent.CardHolderName,
                                           orderStartedEvent.CardExpiration,
                                           orderStartedEvent.Order.Id);

            var buyerUpdated = buyerOriginallyExisted ? 
                _buyerRepository.Update(buyer) : 
                _buyerRepository.Add(buyer);

            await _buyerRepository.UnitOfWork
                .SaveEntitiesAsync();

            var orderStatusChangedTosubmittedIntegrationEvent = new OrderStatusChangedToSubmittedIntegrationEvent(orderStartedEvent.Order.Id, orderStartedEvent.Order.OrderStatus.Name, buyer.Name);
            await _orderingIntegrationEventService.AddAndSaveEventAsync(orderStatusChangedTosubmittedIntegrationEvent);

            _logger.CreateLogger<ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler>()
                .LogTrace("Buyer {BuyerId} and related payment method were validated or updated for orderId: {OrderId}.",
                    buyerUpdated.Id, orderStartedEvent.Order.Id);
        }
    }



А как же... CQRS, там, разделение на команды и запросы, где запись в командах, а чтение в запросах?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910687
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
а вот это почему так объявляется (get/set)? и как именно используется в CQRS?
полудух
Код: c#
1.
public string UserId {get; private set;}



Особенности данной реализации, инкапсуляция, чтобы никто не мог случайно или намеренно изменить значение.


полудух
т.е. пример - говно?


Таки да, к сожалению :(
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910689
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, идеального примера мне найти не удалось. Но во всех проектах нашлось много чего ценного и полезного. Поэтому нам приходилось использовать удачные находки и нарабатывать свои, конечно основываясь на теории и имеющейся практики, а также исходя из текущих и будущих задач.

Сейчас хорошо, искать особо не нужно. Есть постоянно актуализируемый сборник:

https://github.com/ddd-cqrs-es?language=c# (выбран фильтр C# для удобства)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910708
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

имхо люди хотят халявы, статейки с примером на пару экранов
а читать Гради Буча, Бертрана Майера, Мартина Фаулера, Эрика Эванса и др.
понимать когда и почему это всё придумывалось, как развивалась и как применяется сейчас
это же слишком сложно :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910710
Фотография StalkerS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
а вот это почему так объявляется (get/set)? и как именно используется в CQRS?
полудух
Код: c#
1.
public string UserId {get; private set;}


С CQRS это никак не связано, это синтаксис языка С#, а CQRS это подход к архитектуре, причем довольно специфичный и подходящий только для весьма ограниченного числа систем
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910712
Фотография StalkerS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

А как же... CQRS, там, разделение на команды и запросы, где запись в командах, а чтение в запросах?

С CQRS тут все в порядке, Buyer тут является агрегатом, который сохраняется с помощью репозитория, а чтения тут нет
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910720
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StalkerS,

что значит весьма ограниченного числа систем?
В ozon используют CQRS.
А там и электронная коммерция, и логистика, и склады, и биллинг, и туризм...
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910721
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 2gis используют CQRS, и DDD, и Event Storming
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910729
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
а читать Гради Буча, Бертрана Майера, Мартина Фаулера, Эрика Эванса и др.

смысл их читать, если там деза:
hVostt
Понятно, что универсального решения нет. Но у Фаулеровского (от 2013 года) DDD никакого решения на этот счёт нет. Выкручивайтесь сами так сказать.

hVostt
Я Фаулера уважаю. Но это не значит, что буду слепо следовать его указаниям. Нужно пользоваться также и своей головой, и на опыте далеко не всё работает по написанному .
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910730
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буча, кстати, пытался читать "ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОЕКТИРОВАНИЕ С ПРИМЕРАМИ ПРИМЕНЕНИЯ"...
грёбаная дичь... там же 90% воды... чуть не утонул (
посмотрите на главу 12 "ADA. СИСТЕМА УПРАВЛЕНИЯ ДВИЖЕНИЕМ" - читать невозможно, кто так пишет про программирование систем... ГДЕ там про программирование?! Сплошная вода.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910731
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
другое дело Ален Голуб - "Верёвка достаточной длины, чтобы выстрелить себе в ногу"
вот эта книжка лучшая по ООП и программированию в целом.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910732
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Вообще, я ещё немного поковырялся в примере и вот что нашёл:
...

вот щас страшно было, да...
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910739
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
Буча, кстати, пытался читать "ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОЕКТИРОВАНИЕ С ПРИМЕРАМИ ПРИМЕНЕНИЯ"...
грёбаная дичь... там же 90% воды... чуть не утонул (
посмотрите на главу 12 "ADA. СИСТЕМА УПРАВЛЕНИЯ ДВИЖЕНИЕМ" - читать невозможно, кто так пишет про программирование систем... ГДЕ там про программирование?! Сплошная вода.


Да утырки этот Буч и его соавторы, вода и белиберда
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910742
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала сразу ссылку на этот пример хотел кинуть, с телефона было не удобно.
Если я правильно понимаю, там большинство сервисов сами по себе - "Домены", и выделять внутри них какие-то поддомены - лишнее (видимо, в силу простоты, и демонстрации "не надо усложнять там где не надо", и "грести все под одну гребенку"). С ними понятно.
Но, вот этот - Ordering - он содержит и, в том числе, домен. И там, например, есть в

Код: c#
1.
2.
public class Order
        : Entity, IAggregateRoot



такой метод:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
// DDD Patterns comment
        // This Order AggregateRoot's method "AddOrderitem()" should be the only way to add Items to the Order,
        // so any behavior (discounts, etc.) and validations are controlled by the AggregateRoot 
        // in order to maintain consistency between the whole Aggregate. 
        public void AddOrderItem(int productId, string productName, decimal unitPrice, decimal discount, string pictureUrl, int units = 1)
        {
            var existingOrderForProduct = _orderItems.Where(o => o.ProductId == productId)
                .SingleOrDefault();

            if (existingOrderForProduct != null)
            {
                //if previous line exist modify it with higher discount  and units..

                if (discount > existingOrderForProduct.GetCurrentDiscount())
                {
                    existingOrderForProduct.SetNewDiscount(discount);
                }

                existingOrderForProduct.AddUnits(units);
            }
            else
            {
                //add validated new order item

                var orderItem = new OrderItem(productId, productName, unitPrice, discount, pictureUrl, units);
                _orderItems.Add(orderItem);
            }
        }



вроде это так инкапсулирована "чистая" логика домена. Но, как уже говорил Хвост, очень высок риск, что для её реализации могут потребоваться всякие запросы к своему контексту, или даже выйти за него. И вот с этим, собственно, и был связан первоначальный вопрос.

Теперь первоначальный вопрос уточню так:

1) если есть полная уверенность, что можем инкапсулировать "чистую" логика домена, то размещаем её в корне агрегата?
2) если что-то сильно выйдет за рамки 1) - рефакторим - выносим в команды, все-равно деваться некуда, и рефакторинг это не исправление "ошибок", это реакция на новые требования?
3) но, если все-равно есть ненулевая вероятность 2), может, ну его нафиг 1) и сразу 2)?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910745
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
полудух
т.е. пример - говно?


Вообще, я ещё немного поковырялся в примере и вот что нашёл:

https://github.com/dotnet-architecture/eShopOnContainers/blob/23992ed3249cd257ac5fc42b23f2864b2ddf347b/src/Services/Ordering/Ordering.API/Application/DomainEventHandlers/OrderStartedEvent/ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler.cs

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
    public class ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler
                        : INotificationHandler<OrderStartedDomainEvent>
    {
        private readonly ILoggerFactory _logger;
        private readonly IBuyerRepository _buyerRepository;
        private readonly IIdentityService _identityService;
        private readonly IOrderingIntegrationEventService _orderingIntegrationEventService;

        public ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler(
            ILoggerFactory logger, 
            IBuyerRepository buyerRepository, 
            IIdentityService identityService,
            IOrderingIntegrationEventService orderingIntegrationEventService)
        {
            _buyerRepository = buyerRepository ?? throw new ArgumentNullException(nameof(buyerRepository));
            _identityService = identityService ?? throw new ArgumentNullException(nameof(identityService));
            _orderingIntegrationEventService = orderingIntegrationEventService ?? throw new ArgumentNullException(nameof(orderingIntegrationEventService));
            _logger = logger ?? throw new ArgumentNullException(nameof(logger));
        }

        public async Task Handle(OrderStartedDomainEvent orderStartedEvent, CancellationToken cancellationToken)
        {            
            var cardTypeId = (orderStartedEvent.CardTypeId != 0) ? orderStartedEvent.CardTypeId : 1;
            var buyer = await _buyerRepository.FindAsync(orderStartedEvent.UserId);
            bool buyerOriginallyExisted = (buyer == null) ? false : true;

            if (!buyerOriginallyExisted)
            {                
                buyer = new Buyer(orderStartedEvent.UserId, orderStartedEvent.UserName);
            }

            buyer.VerifyOrAddPaymentMethod(cardTypeId,
                                           $"Payment Method on {DateTime.UtcNow}",
                                           orderStartedEvent.CardNumber,
                                           orderStartedEvent.CardSecurityNumber,
                                           orderStartedEvent.CardHolderName,
                                           orderStartedEvent.CardExpiration,
                                           orderStartedEvent.Order.Id);

            var buyerUpdated = buyerOriginallyExisted ? 
                _buyerRepository.Update(buyer) : 
                _buyerRepository.Add(buyer);

            await _buyerRepository.UnitOfWork
                .SaveEntitiesAsync();

            var orderStatusChangedTosubmittedIntegrationEvent = new OrderStatusChangedToSubmittedIntegrationEvent(orderStartedEvent.Order.Id, orderStartedEvent.Order.OrderStatus.Name, buyer.Name);
            await _orderingIntegrationEventService.AddAndSaveEventAsync(orderStatusChangedTosubmittedIntegrationEvent);

            _logger.CreateLogger<ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler>()
                .LogTrace("Buyer {BuyerId} and related payment method were validated or updated for orderId: {OrderId}.",
                    buyerUpdated.Id, orderStartedEvent.Order.Id);
        }
    }



А как же... CQRS, там, разделение на команды и запросы, где запись в командах, а чтение в запросах?


вангую, что может автор хотел подчеркнуть, что все основное было в источнике события. и так как тут нет какой-то присущей именно команде логики, связанной с языком предметной области, все взял на себя домен, валидатор, то решил - "тут обойдемся репозиторием". Хотя, для единообразия ради, можно это было и в команде, наверное.

такие моменты у меня и вызывают вопросы. не думаю, что это он так облажался. скорее всего не хватило выразительности DDD
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910749
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

полудух
т.е. пример - говно?


Таки да, к сожалению :(


можешь выделить, что тебе особенно не понравилось, а как бы ты сделал?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910756
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
hVostt,

имхо люди хотят халявы, статейки с примером на пару экранов
а читать Гради Буча, Бертрана Майера, Мартина Фаулера, Эрика Эванса и др.
понимать когда и почему это всё придумывалось, как развивалась и как применяется сейчас
это же слишком сложно :)


золотые слова! хотим халявы!
есть какие-то более-менее приближенные к примеру комментарии?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910758
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
hVostt,

имхо люди хотят халявы, статейки с примером на пару экранов
а читать Гради Буча, Бертрана Майера, Мартина Фаулера, Эрика Эванса и др.
понимать когда и почему это всё придумывалось, как развивалась и как применяется сейчас
это же слишком сложно :)

список этих долбоебов слишком велик, а гарантий, что они там что то написали правильно - исчезающе мал
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910766
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
skyANA
hVostt,

имхо люди хотят халявы, статейки с примером на пару экранов
а читать Гради Буча, Бертрана Майера, Мартина Фаулера, Эрика Эванса и др.
понимать когда и почему это всё придумывалось, как развивалась и как применяется сейчас
это же слишком сложно :)

список этих долбоебов слишком велик, а гарантий, что они там что то написали правильно - исчезающе мал


отбросим это. что хотел сказать?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910771
mirudom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые форумчане,
Где то до кода, который приводится, должно быть написано, что мол код не является промышленным, а только служит иллюстрацией к описанию проблемы/паттерна в лучшем случае в каком то конкретном контексте.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910772
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StalkerS
hVostt

А как же... CQRS, там, разделение на команды и запросы, где запись в командах, а чтение в запросах?

С CQRS тут все в порядке, Buyer тут является агрегатом, который сохраняется с помощью репозитория, а чтения тут нет


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

Сейчас тут далеко не всё в порядке.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910773
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
skyANA
а читать Гради Буча, Бертрана Майера, Мартина Фаулера, Эрика Эванса и др.

смысл их читать, если там деза:
hVostt
Понятно, что универсального решения нет. Но у Фаулеровского (от 2013 года) DDD никакого решения на этот счёт нет. Выкручивайтесь сами так сказать.

hVostt
Я Фаулера уважаю. Но это не значит, что буду слепо следовать его указаниям. Нужно пользоваться также и своей головой, и на опыте далеко не всё работает по написанному .


Это не деза. Это люди, у которых ещё имеется собственные взгляды и мнения, которые не являются аксиомами. Знать различные точки зрения и подходы очень полезно.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910775
mirudom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще.
Уважаемые форумчане,
еже ли было б ВСЕ просто и однозначно, то мы б составили конкуренцию людям, которых нанимают вместо московских дворников.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910776
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
hVostt,

имхо люди хотят халявы, статейки с примером на пару экранов
а читать Гради Буча, Бертрана Майера, Мартина Фаулера, Эрика Эванса и др.
понимать когда и почему это всё придумывалось, как развивалась и как применяется сейчас
это же слишком сложно :)


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

Всегда хочется найти "единственно правильное решение", или близкое к нему.
Особенно это выражается в начале пути, и у меня так было.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910779
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach
такой метод:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
// DDD Patterns comment
        // This Order AggregateRoot's method "AddOrderitem()" should be the only way to add Items to the Order,
        // so any behavior (discounts, etc.) and validations are controlled by the AggregateRoot 
        // in order to maintain consistency between the whole Aggregate. 
        public void AddOrderItem(int productId, string productName, decimal unitPrice, decimal discount, string pictureUrl, int units = 1)
        {
            var existingOrderForProduct = _orderItems.Where(o => o.ProductId == productId)
                .SingleOrDefault();

            if (existingOrderForProduct != null)
            {
                //if previous line exist modify it with higher discount  and units..

                if (discount > existingOrderForProduct.GetCurrentDiscount())
                {
                    existingOrderForProduct.SetNewDiscount(discount);
                }

                existingOrderForProduct.AddUnits(units);
            }
            else
            {
                //add validated new order item

                var orderItem = new OrderItem(productId, productName, unitPrice, discount, pictureUrl, units);
                _orderItems.Add(orderItem);
            }
        }




вроде это так инкапсулирована "чистая" логика домена. Но, как уже говорил Хвост, очень высок риск, что для её реализации могут потребоваться всякие запросы к своему контексту, или даже выйти за него. И вот с этим, собственно, и был связан первоначальный вопрос.

Теперь первоначальный вопрос уточню так:

1) если есть полная уверенность, что можем инкапсулировать "чистую" логика домена, то размещаем её в корне агрегата?
2) если что-то сильно выйдет за рамки 1) - рефакторим - выносим в команды, все-равно деваться некуда, и рефакторинг это не исправление "ошибок", это реакция на новые требования?
3) но, если все-равно есть ненулевая вероятность 2), может, ну его нафиг 1) и сразу 2)?



Во-первых, создание позиции заказа делегируется методу, который просто должен добавить эту позицию, а не менять существующие или делать что-то там ещё, поэтому сразу напрашивается рефакторинг:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        // DDD Patterns comment
        // This Order AggregateRoot's method "AddOrderitem()" should be the only way to add Items to the Order,
        // so any behavior (discounts, etc.) and validations are controlled by the AggregateRoot 
        // in order to maintain consistency between the whole Aggregate. 
        public void AddOrderItem(OrderItem orderItem)
        {
            if (orderItems.Any(o => o.ProductId == productId))
            {
                throw new InvalidOperationException("A similar order item is already exists.");
            }
            else
            {
                _orderItems.Add(orderItem);
            }
        }



Отвечая на вопросы:

love_bach
1) если есть полная уверенность, что можем инкапсулировать "чистую" логика домена, то размещаем её в корне агрегата?
2) если что-то сильно выйдет за рамки 1) - рефакторим - выносим в команды, все-равно деваться некуда, и рефакторинг это не исправление "ошибок", это реакция на новые требования?
3) но, если все-равно есть ненулевая вероятность 2), может, ну его нафиг 1) и сразу 2)?


Я придерживаюсь проверенного на практике мнения, что при использовании CQRS, все изменения необходимо производить только в командах. Это позволяет точно понимать что вообще с доменом происходит и где это искать.

Не нужно делать поиск по всему проекту, а где же ЕЩЁ используется репозиторий, и где ждать жёсткого подсрачника при рефакторинге или при выпуске релиза.

Размещая логику в аргегате, рано или поздно придёт понимание, что это не логика никакая. Это всего лишь методы, изменяющие агрегат. Добавить/удалить вложенную сущность (позиция заказа, например), изменить цену, количество, наименование и т.д. Или какая-то базовая примитивная валидация. Польза сомнительная, затраты существенные.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910783
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach
можешь выделить, что тебе особенно не понравилось, а как бы ты сделал?


В формате форума нет :)
Я бы код показал, если бы не NDA, поэтому могу только поделиться собственным опытом на конкретных примерах, но не в рамках целого проекта, это слишком затратно (
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910786
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
love_bach
можешь выделить, что тебе особенно не понравилось, а как бы ты сделал?


В формате форума нет :)
Я бы код показал, если бы не NDA, поэтому могу только поделиться собственным опытом на конкретных примерах, но не в рамках целого проекта, это слишком затратно (

Я же код не прошу, словами могешь обяснмть?ⁿ
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910815
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
skyANA
hVostt,

имхо люди хотят халявы, статейки с примером на пару экранов
а читать Гради Буча, Бертрана Майера, Мартина Фаулера, Эрика Эванса и др.
понимать когда и почему это всё придумывалось, как развивалась и как применяется сейчас
это же слишком сложно :)

список этих долбоебов слишком велик, а гарантий, что они там что то написали правильно - исчезающе мал
Критикуешь - предлагай.
Если сам не долбоеб :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910816
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach
skyANA
hVostt,

имхо люди хотят халявы, статейки с примером на пару экранов
а читать Гради Буча, Бертрана Майера, Мартина Фаулера, Эрика Эванса и др.
понимать когда и почему это всё придумывалось, как развивалась и как применяется сейчас
это же слишком сложно :)


золотые слова! хотим халявы!
есть какие-то более-менее приближенные к примеру комментарии?
Я сейчас в снегах Удмуртии, связь - говно :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910821
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910837
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach
Я же код не прошу, словами могешь обяснмть?ⁿ


Всё о чём я уже говорил.
Убрать логику из домена.
Изменение в домене должно происходить исключительно в командах.
Команды не должны сохранять изменения, это область ответственности UOW и клиента, инициирующего изменения.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910840
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
ViPRos
пропущено...

список этих долбоебов слишком велик, а гарантий, что они там что то написали правильно - исчезающе мал
Критикуешь - предлагай.
Если сам не долбоеб :)

посыл был в том что - предлагающие долбоебы
остальные - верующие
ни один пидер не может ограничить ни один контекст, ни один агрегат не сможет агрегировать всех составляющих, любой компонент любого агрегата норовить стать всеобъемлющим,...
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910841
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
love_bach
Я же код не прошу, словами могешь обяснмть?ⁿ


Всё о чём я уже говорил.
Убрать логику из домена.
Изменение в домене должно происходить исключительно в командах.
Команды не должны сохранять изменения, это область ответственности UOW и клиента, инициирующего изменения.

т.е. никакого "домена" и нет, а есть схема, и общесхемные команды
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910852
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
посыл был в том что - предлагающие долбоебы


Почему у тебя такое сложилось мнение?

ViPRos
остальные - верующие


Абсолютная вера однозначно плохо.


ViPRos
ни один пидер не может ограничить ни один контекст, ни один агрегат не сможет агрегировать всех составляющих, любой компонент любого агрегата норовить стать всеобъемлющим,...


Глупости говоришь.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910853
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
т.е. никакого "домена" и нет, а есть схема, и общесхемные команды


Проблема в некорректном применении ООП.
DDD и ООП -- вещи ортогональные.

Ничего в DDD не сказано о том, как именно его нужно реализовывать. Что это обязательно должно быть сделано на объектах, используя инкапсуляцию, наследование, полиформизм, что называется "из коробки".

На мой взгляд, это биг мистейк.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910858
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
ViPRos
т.е. никакого "домена" и нет, а есть схема, и общесхемные команды


Проблема в некорректном применении ООП.
DDD и ООП -- вещи ортогональные.

Ничего в DDD не сказано о том, как именно его нужно реализовывать. Что это обязательно должно быть сделано на объектах, используя инкапсуляцию, наследование, полиформизм, что называется "из коробки".

На мой взгляд, это биг мистейк.


это одно и то же (фуфло)
просто немного ослаблены требования
ты уже должен был понять, что невозможно определить контекст где однозначно определен хоть что либо во времени
только прошлое может быть описано
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910860
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
это одно и то же (фуфло)
просто немного ослаблены требования
ты уже должен был понять, что невозможно определить контекст где однозначно определен хоть что либо во времени
только прошлое может быть описано


Очень даже возможно.
Не на всю жизнь, но на текущий момент.
Понимая, что всё меняется, код должен быть refactoring-ready.

Когда видишь такую реализацию DDD, что в ней всё прибито гвоздями, и вообще проще переписать, чем исправить, то вовсе не обязательно DDD плохой, а те, кто его придумал "пидарасы" :)

Ограниченный контекст -- это про "разделяй и властвуй".
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910872
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach

Теперь первоначальный вопрос уточню так:

1) если есть полная уверенность, что можем инкапсулировать "чистую" логика домена, то размещаем её в корне агрегата?
2) если что-то сильно выйдет за рамки 1) - рефакторим - выносим в команды, все-равно деваться некуда, и рефакторинг это не исправление "ошибок", это реакция на новые требования?
3) но, если все-равно есть ненулевая вероятность 2), может, ну его нафиг 1) и сразу 2)?

1) В корне агрегата размещается только логика общая для агрегата, остальная логика размещается в сущностях
2) Это нормальная ситуация, возникающая регулярно. Рефакторинг производится если новая логика лучше ложится на конкретную сущность/агрегат, а та, что не ложится - отправляется в сервисы
3) Куда "нафиг"? Сразу в процедурную лапшу? Вас проклянут те, кто будет это потом поддерживать
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910873
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
skyANA
пропущено...
Критикуешь - предлагай.
Если сам не долбоеб :)

посыл был в том что - предлагающие долбоебы
остальные - верующие
ни один пидер не может ограничить ни один контекст, ни один агрегат не сможет агрегировать всех составляющих, любой компонент любого агрегата норовить стать всеобъемлющим,...
Глупости какие-то.
Про DDD и ограниченный (bounded) контекст явно не слышал, на практике применить не пробовал, а поносишь.
Спрашивается в чем причина? В том что тебя сливают на пенсию?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910874
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
hVostt
пропущено...


Проблема в некорректном применении ООП.
DDD и ООП -- вещи ортогональные.

Ничего в DDD не сказано о том, как именно его нужно реализовывать. Что это обязательно должно быть сделано на объектах, используя инкапсуляцию, наследование, полиформизм, что называется "из коробки".

На мой взгляд, это биг мистейк.


это одно и то же (фуфло)
просто немного ослаблены требования
ты уже должен был понять, что невозможно определить контекст где однозначно определен хоть что либо во времени
только прошлое может быть описано
Всё возможно, правда не один а множество ограниченных контекстов.
Event Storming тебе в помощь.
Глянь мастер-классы тех же 2gis.
Они, кстати, придерживаются несколько другим взгляда на DDD, чем Эванс (это про верующих).
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910875
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
hVostt
пропущено...


Всё о чём я уже говорил.
Убрать логику из домена.
Изменение в домене должно происходить исключительно в командах.
Команды не должны сохранять изменения, это область ответственности UOW и клиента, инициирующего изменения.

т.е. никакого "домена" и нет, а есть схема, и общесхемные команды

С такими высказываниями он нам тут про верующих и долбоебов затирает )))
ИМХО ты и есть тот, о ком пишешь: яростно отрицаешь чужое и проповедуешь своё.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910885
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
ViPRos
пропущено...

посыл был в том что - предлагающие долбоебы
остальные - верующие
ни один пидер не может ограничить ни один контекст, ни один агрегат не сможет агрегировать всех составляющих, любой компонент любого агрегата норовить стать всеобъемлющим,...
Глупости какие-то.
Про DDD и ограниченный (bounded) контекст явно не слышал, на практике применить не пробовал, а поносишь.
Спрашивается в чем причина? В том что тебя сливают на пенсию?

ты как был неучем, так и остался, хотя прочитал кажись всех долбоебов на свете
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910886
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
ViPRos
пропущено...

т.е. никакого "домена" и нет, а есть схема, и общесхемные команды

С такими высказываниями он нам тут про верующих и долбоебов затирает )))
ИМХО ты и есть тот, о ком пишешь: яростно отрицаешь чужое и проповедуешь своё.

чудик, если чек не понимает чей этот метод - агрегата, сущности или инфраструктуры, то скорее всего все эти агрегаты и сущности надуманы (текущий уровень понимания предметной области)
В нормальных системах главное - схема.
Агрегаты и независимые сущности вычислимы.
Контексты (кластеры, подсистемы) вычислимы.
Инфраструктурные методы (включая сериализации, десериализации,...) общесхемны и т.д.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910895
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
skyANA
пропущено...
Глупости какие-то.
Про DDD и ограниченный (bounded) контекст явно не слышал, на практике применить не пробовал, а поносишь.
Спрашивается в чем причина? В том что тебя сливают на пенсию?

ты как был неучем, так и остался, хотя прочитал кажись всех долбоебов на свете

Критикуешь - предлагай.
В последнее время ты только говном исходишь.

Долбоебы, неучи... Кого ты на нас проецируешь? Своих коллег, что тебя моложе?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910900
Фотография StalkerS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

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

У вас в голове каша. Слово Command в CQRS не означает, что нужно в буквальном смысле создавать классы команд и только из них производить изменения. В данном примере изменения в агрегат вносятся как из хэндлеров команд, так и из хэндлеров событий, все логично и полностью соответствует CQRS
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910923
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
skyANA
пропущено...

С такими высказываниями он нам тут про верующих и долбоебов затирает )))
ИМХО ты и есть тот, о ком пишешь: яростно отрицаешь чужое и проповедуешь своё.

чудик, если чек не понимает чей этот метод - агрегата, сущности или инфраструктуры, то скорее всего все эти агрегаты и сущности надуманы (текущий уровень понимания предметной области)
В нормальных системах главное - схема.
Агрегаты и независимые сущности вычислимы.
Контексты (кластеры, подсистемы) вычислимы.
Инфраструктурные методы (включая сериализации, десериализации,...) общесхемны и т.д.


Какой-то 1С или Акцесс сразу представил. И как там все "вычисляется"
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910968
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StalkerS
полностью соответствует CQRS

...соответствует "по Фаулеру"?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39910983
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach

Какой-то 1С или Акцесс сразу представил. И как там все "вычисляется"

Не знаю, что там и как вычисляется, а так алгоритм простой.
Граф связей сущностей анализируется, выбираются терминальные узлы, рассматриваются характер связей (разноглубинность и т.д.) ТУ и на основе этого выделяются агрегаты (макротипы) и/или независимые общесхемные узлы (это в обычном понимании "справочники").
Макротипы анализируются на предмет общих связей и кластеризуюутся в подсистемы.
На основе этой информации генерируется динамическое меню.

В системе уже имеются команды типа -
Создать форму для макротипа
Добавить элемент в макротип
Удалить элемент из макротипа
Сохранить изменения
...
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911002
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
StalkerS
hVostt

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

У вас в голове каша. Слово Command в CQRS не означает, что нужно в буквальном смысле создавать классы команд и только из них производить изменения. В данном примере изменения в агрегат вносятся как из хэндлеров команд, так и из хэндлеров событий, все логично и полностью соответствует CQRS


При чём тут буквальный смысл? Понятно, что исполняет команду хендлер.

Изменения вносятся не в командах, всё уже не соответствует. Зачем тогда команды? Вносите их где угодно. Получили репозиторий, и делайте своё грязное дело. Зачем вам CQRS, не пойму?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911003
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
Не знаю, что там и как вычисляется, а так алгоритм простой.
Граф связей сущностей анализируется, выбираются терминальные узлы, рассматриваются характер связей (разноглубинность и т.д.) ТУ и на основе этого выделяются агрегаты (макротипы) и/или независимые общесхемные узлы (это в обычном понимании "справочники").
Макротипы анализируются на предмет общих связей и кластеризуюутся в подсистемы.
На основе этой информации генерируется динамическое меню.

В системе уже имеются команды типа -
Создать форму для макротипа
Добавить элемент в макротип
Удалить элемент из макротипа
Сохранить изменения
...


Чёт уже какая-то жесть пошла. Ну тогда иди до конца, пусть это чудо само логику вычисляет и вообще работу работает :))
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911021
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt


Чёт уже какая-то жесть пошла. Ну тогда иди до конца, пусть это чудо само логику вычисляет и вообще работу работает :))

Дык ВИПРОС же
пишешь только то, чего нельзя вычислить и вызываешь там где надо (метод типа, макротипа, схемы - ничем они не отличаются, привязка к чему либо только для визуализации места вызова)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911024
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
hVostt


Чёт уже какая-то жесть пошла. Ну тогда иди до конца, пусть это чудо само логику вычисляет и вообще работу работает :))

Дык ВИПРОС же
пишешь только то, чего нельзя вычислить и вызываешь там где надо (метод типа, макротипа, схемы - ничем они не отличаются, привязка к чему либо только для визуализации места вызова)


Да это понятно. От того, куда ты перенесёшь программирование и проектирование бизнес-логики, суть нифига не меняется.

Скажу по чеснаку, да. Так оно и выходит.

Делаешь крутой инструмент с динамическим рантайм моделированием.
Отдаёшь людям, которые больше про бизнес, чем про разработку.
Потом смотришь, мама дорогая, это что за пиз...цц??
Просто огромная, бескрайняя куча сущностей, связей, атрибутов и прочего прочего прочего.

Ну конечно, не дурак, подумал об этом заранее. Сразу сделал +100500 возможностей для таксономии, чтобы по полочкам всё раскладывать да по шкафчикам.

И типа, а чё б автоматом всё не проанализировать и по связям понять чё к чему.

Ну-ну. Ага. Два раза.

Моделировать бизнес не может кто угодно. Только в сопливых мечтах видится тул, в котором спроектировать бизнес может любая домохозяйка, а оно потом как-нибудь само. Хороший инструмент позволяет решать задачу быстрее и эффективнее. Но он не решает задачу сам.

Поэтому ограниченный контекст тебе нужен, не важно ВИПРОС у тебя там, 1С или бейсик.

Ты ж готовишь на кухне, занимаешься в спортзале, в спальне спишь, а не всё в одном месте делаешь, так?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911025
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

И ещё, ты забываешь, что ВИПРОС у тебя один.
Получается, что у тебя есть бульдозер для всех задач.
И для высоконагруженных, динамичных, и крайне чувствительных, секьюрных, для всего.
Отсюда отсутствие ограничений, о котором ты распинаешься, приводит к тотальным ограничениям.
Про какое-либо масштабирование можно только влажно помечтать. И поплакать.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911037
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
ViPRos,

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


да ерунда все это (масштабирование и т.д.), можно сварганить все что угодно, лишь бы кто платил за это
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911049
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
да ерунда все это (масштабирование и т.д.), можно сварганить все что угодно, лишь бы кто платил за это


Никто не говорит, что ничего нельзя сделать, знатно наговнокодив.
Много проектов, знаешь ли, были реализованы таким образом.
Но за всё приходится платить.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911078
stenford
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

А как же... CQRS, там, разделение на команды и запросы, где запись в командах, а чтение в запросах?

ой как все запущено-то, ни в ООП, ни в CQRS ты не соображаешь ровном счетом ничего, оторви сначала свой уровень от плинтуса, может дойдет как именно работает это пример от майкрософт и почему
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911082
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stenford
hVostt

А как же... CQRS, там, разделение на команды и запросы, где запись в командах, а чтение в запросах?

ой как все запущено-то, ни в ООП, ни в CQRS ты не соображаешь ровном счетом ничего, оторви сначала свой уровень от плинтуса, может дойдет как именно работает это пример от майкрософт и почему


Сначала свой уровень свиньи до разумного человеческого подними, потом и поговорим.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911090
Фотография StalkerS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
StalkerS
пропущено...

У вас в голове каша. Слово Command в CQRS не означает, что нужно в буквальном смысле создавать классы команд и только из них производить изменения. В данном примере изменения в агрегат вносятся как из хэндлеров команд, так и из хэндлеров событий, все логично и полностью соответствует CQRS


При чём тут буквальный смысл? Понятно, что исполняет команду хендлер.

Изменения вносятся не в командах, всё уже не соответствует.

При том, что CQRS разделяет понятие модели для запросов/команд, а никак не диктует из каких классов производить действия, последнее вообще не имеет к CQRS никакого отношения
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911112
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Никто не говорит, что ничего нельзя сделать, знатно наговнокодив.
Но за всё приходится платить.

Наговнокодить - ООП, О/RМ, CQRS, … система костылей
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911151
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
ViPRos
да ерунда все это (масштабирование и т.д.), можно сварганить все что угодно, лишь бы кто платил за это


Никто не говорит, что ничего нельзя сделать, знатно наговнокодив.
Много проектов, знаешь ли, были реализованы таким образом.
Но за всё приходится платить.
они жеж оружием торгуют, на фига им что-то там масштабировать?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911152
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слепили ВИПРОС 20 лет назад и теперь тупо технический долг отдают, что-то в нём бесконечно оптимизируя и поддерживая.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911169
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA
Слепили ВИПРОС 20 лет назад и теперь тупо технический долг отдают, что-то в нём бесконечно оптимизируя и поддерживая.

Звучит как очень успешное поделие, в то время как много грамотно архитектурных решений не дотягивают даже до года )
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911171
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
skyANA
Слепили ВИПРОС 20 лет назад и теперь тупо технический долг отдают, что-то в нём бесконечно оптимизируя и поддерживая.

Звучит как очень успешное поделие, в то время как много грамотно архитектурных решений не дотягивают даже до года )
В чем успешность измеряете?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911177
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
love_bach,
Как-то не интуитивно, часть логики в корне агрегации, часть не там?
А как там разруливается, например, что есть уже такой агрегат? Уникальность в БД. Где это должно быть?

логики агрегатах быть не должно. ни в корне, ни в сущностях.
уникальность DDD не поддерживает, она описывается отдельно, вариантов масса.

я тупой или что происходит? как вас понимать обоих :D
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911185
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtes
hVostt
love_bach,
пропущено...

логики агрегатах быть не должно. ни в корне, ни в сущностях.
уникальность DDD не поддерживает, она описывается отдельно, вариантов масса.


я тупой или что происходит? как вас понимать обоих :D

вот тут неплохо описаны агрегаты (с картинками)
надо промотать до главы "What is an Aggregate?"
(может hVostt прокомментирует, насколько там данные соответствуют действительности?)

агрегаты просто разбивают весь проект на части
каждый агрегат это набор сущностей

А логика лежит в других классах - в тех, которые делают WRITE и READ

с другой стороны, класс сущности ну совсем БЕЗ логики слабо себе представляю...
какая-то логика там же всё равно должна быть? какая?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911193
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA
Hexag0v
пропущено...

Звучит как очень успешное поделие, в то время как много грамотно архитектурных решений не дотягивают даже до года )
В чем успешность измеряете?

В данном конкретном случае, это продожительность времени в течении которого продукт выживает на очень не простом рынке.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911197
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
Roman Mejtes
пропущено...


я тупой или что происходит? как вас понимать обоих :D

вот тут неплохо описаны агрегаты (с картинками)
надо промотать до главы "What is an Aggregate?"
(может hVostt прокомментирует, насколько там данные соответствуют действительности?)

агрегаты просто разбивают весь проект на части
каждый агрегат это набор сущностей

А логика лежит в других классах - в тех, которые делают WRITE и READ

с другой стороны, класс сущности ну совсем БЕЗ логики слабо себе представляю...
какая-то логика там же всё равно должна быть? какая?

Вот тут общая модель, Выделенный агрегат и логика агрегата
Вся логика уровня сущности привязана к сущностям
Инфраструктурная логика принадлежит модели
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911198
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
skyANA
пропущено...
В чем успешность измеряете?

В данном конкретном случае, это продожительность времени в течении которого продукт выживает на очень не простом рынке.
На каком ещё рынке? На рынке Алмаз-Антей?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911199
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

Агрегат
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911200
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

Собственная Логика агрегата
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911201
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20 лет назад эванс с фаулером под стол пешком ходили :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911202
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA
Hexag0v
пропущено...

В данном конкретном случае, это продожительность времени в течении которого продукт выживает на очень не простом рынке.
На каком ещё рынке? На рынке Алмаз-Антей?

Рынок программного обеспечения.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911209
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
Вот тут общая модель, Выделенный агрегат и логика агрегата
Вся логика уровня сущности привязана к сущностям
Инфраструктурная логика принадлежит модели

красные это агрегаты?
а чего они то "типы", то "макротипы"?
А белые это сущности? Почему тогда "процесс нормативный" и "тип процесса" не внутри сущности "Процесс"?
треугольная часть сверху (на некоторых) - что означает?
уровень взаимодействия красных с белыми не очень понятен...
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911212
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
20 лет назад эванс с фаулером под стол пешком ходили :)
ты в 47 начал под стол пешком ходить? допился что-ли? :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911213
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
skyANA
пропущено...
На каком ещё рынке? На рынке Алмаз-Антей?

Рынок программного обеспечения.
и в каком же сегменте, нише данного рынка по вашему представлен ВИПРОС?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911218
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
ViPRos
20 лет назад эванс с фаулером под стол пешком ходили :)
ты в 47 начал под стол пешком ходить? допился что-ли? :)

не надо прибавлять годы, пенсия маленькая :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911222
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
ViPRos
Вот тут общая модель, Выделенный агрегат и логика агрегата
Вся логика уровня сущности привязана к сущностям
Инфраструктурная логика принадлежит модели

красные это агрегаты?
а чего они то "типы", то "макротипы"?
А белые это сущности? Почему тогда "процесс нормативный" и "тип процесса" не внутри сущности "Процесс"?
треугольная часть сверху (на некоторых) - что означает?
уровень взаимодействия красных с белыми не очень понятен...

да "про это" уже 100 раз тут говорили
есть типы, которые могут быть связаны
некоторое количество типов и связей могут быть выделены как агрегат (макротип)
тип, который не ссылается ни на один из типов внутри агрегата является несущим (базовым)
один и тот же тип может быть несущим для многих агрегатов с разной структурой
внутри агрегата свойства типа могут быть изменены в сторону усиления ограничений (вплоть до изъятия с указанием значения или/или функции по умолчанию)
агрегат агрегирует не все связи и связанные типы (обычно ссылки на терминальные типы и сами терминальные типы (справочники, в данном случае допустим "Тип процесса")
агрегаты могут пересекаться
и т.д.

красным отмечены на общей схеме те типы для которых сделана попытка раскрыть связи (сразу всю схему е показываю, так как там может быть огромное количество типов и связей)
а на агрегате красным помечен несущий тип агрегата (макротипа)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911227
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA
Hexag0v
пропущено...

Рынок программного обеспечения.
и в каком же сегменте, нише данного рынка по вашему представлен ВИПРОС?

А какая разница?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911260
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
skyANA
пропущено...
и в каком же сегменте, нише данного рынка по вашему представлен ВИПРОС?

А какая разница?
Действительно, а какая разница томографию делать, билеты на самолёт покупать, или 3д принтером управлять.
ВИПРОС одинаково нигде не подходит :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911273
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух
вот тут неплохо описаны агрегаты (с картинками)
надо промотать до главы "What is an Aggregate?"
(может hVostt прокомментирует, насколько там данные соответствуют действительности?)


Ну если кратко, я не со всем согласен, о чём рассказывается в статье.

1. Отдельные сервисы превратили в аргегаты. Это ортогональные вещи, не стоит слепо так делать. Агрегат это целостная структура, как молекула, состоящая из атомов. И речь здесь идёт о модели данных и связей между ними. Логика инкапсулируется в ограниченном контексте. В нём могут быть несколько агрегатов, а не один.

2. Одна транзакция создаёт или обновляет один агрегат -- какая-то глупость. Зачем, почему так? Если в контексте CQRS, то логично, что одна команда изменяет один агрегат, не больше и не меньше. Если в контексте изменения одного агрегата вносятся изменения в другой, то команда выполняет вложенную команду.

А бизнес-транзакция может быть сколько угодно сложная, откуда появились саги и прочие решения?


полудух
с другой стороны, класс сущности ну совсем БЕЗ логики слабо себе представляю...
какая-то логика там же всё равно должна быть? какая?


Инфраструктурная логика. Никакой бизнес-логики. Почему? Потому что агрегат на себе никогда не вывезет все требования бизнеса, не превратившись при этом в неподдерживаемое чудовище.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911275
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
Hexag0v
пропущено...

А какая разница?
Действительно, а какая разница томографию делать, билеты на самолёт покупать, или 3д принтером управлять.
ВИПРОС одинаково нигде не подходит :)


Скажу больше. Даже в задачах, которые реализует ВИПРОС большинство ходов расстрельные. Хотим вынести функционал в веб? Досвидания. Хотим распространить решение за рамки рабочих мест windows? Досвидания. Реализовать мобильную логику? Досвидания.

Тут вообще за рамки учётной системы в конкретных жёстких условиях не выйти, без переписывания всего и вся. Или лепить какие-то коннекторы и адаптеры.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911277
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

Тут ещё другие вопросы есть.Не для самой платформы, а для той логики, которую показывает ViPRos, есть ли тестирование? Принципиально возможно? Пишет кто-то тесты? Запускает при изменении? Рефакторинг логики? Версионность? Есть ли среды? Процессы доставки?

В мегаубожеском (имхо) SAP-е, например, это всё есть из коробки. На тестирование конечно обычно клали, но вот среды есть, и с этим строго.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911282
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
Ну если кратко, я не со всем согласен, о чём рассказывается в статье.

ясно, спасибо
ты наверное когда начинал свой проект тоже думал "о, ща быстренько сделаем всё по мануалу, книжки все есть"...
а через год рефакторить весь этот гемор, потому что его писали теоретики
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911310
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA
Hexag0v
пропущено...

А какая разница?
Действительно, а какая разница томографию делать, билеты на самолёт покупать, или 3д принтером управлять.

Причем тут принтер? Можно привести еще вагон примеров, для чего он не подходит.
Продукт занимает свою нишу, где успешно решает конкретные задачи.

skyANAВИПРОС одинаково нигде не подходит
20 лет живет и поддерживается продукт, который нигде не подходит, странно.. :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911314
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt

Тут ещё другие вопросы есть.Не для самой платформы, а для той логики, которую показывает ViPRos, есть ли тестирование? Принципиально возможно? Пишет кто-то тесты? Запускает при изменении? Рефакторинг логики? Версионность? Есть ли среды? Процессы доставки?

Вижу у вас нет опыта, когда нужно CI/CD и Web API добавить в большой легаси проект )
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911320
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
skyANA
пропущено...
Действительно, а какая разница томографию делать, билеты на самолёт покупать, или 3д принтером управлять.

Причем тут принтер? Можно привести еще вагон примеров, для чего он не подходит.
Продукт занимает свою нишу, где успешно решает конкретные задачи.

skyANAВИПРОС одинаково нигде не подходит

20 лет живет и поддерживается продукт, который нигде не подходит, странно.. :)Это разработка под конкретного заказчика Алмаз-Антей.
В этой нише просто нет конкуренции.

И больше никуда этот продукт не подходит. И особо не развивается.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911321
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
hVostt

Тут ещё другие вопросы есть.Не для самой платформы, а для той логики, которую показывает ViPRos, есть ли тестирование? Принципиально возможно? Пишет кто-то тесты? Запускает при изменении? Рефакторинг логики? Версионность? Есть ли среды? Процессы доставки?

Вижу у вас нет опыта, когда нужно CI/CD и Web API добавить в большой легаси проект )
Наоборот есть.
Продуктам нашей компании 14 с лишним лет.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911327
mirudom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosчудик, если чек не понимает чей этот метод - агрегата, сущности или инфраструктуры, то скорее всего все эти агрегаты и сущности надуманы (текущий уровень понимания предметной области)
В нормальных системах главное - схема.
Агрегаты и независимые сущности вычислимы.
Контексты (кластеры, подсистемы) вычислимы.
Инфраструктурные методы (включая сериализации, десериализации,...) общесхемны и т.д. Уважаемый ViPRos,
а есть где почитать подробнее про то, что Вы описываете ?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911339
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA

Это разработка под конкретного заказчика Алмаз-Антей.
В этой нише просто нет конкуренции.

И больше никуда этот продукт не подходит. И особо не развивается.


Внутрекорпоротивный софт заменить сложней, но и видел как компания отказывалась от личных разаработок, переходя на субподрядчиков или полукоробочные продукты.
В целом я понял куда вы клоните )
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911340
Hexag0v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
skyANA
Hexag0v
пропущено...

Вижу у вас нет опыта, когда нужно CI/CD и Web API добавить в большой легаси проект )
Наоборот есть.
Продуктам нашей компании 14 с лишним лет.

Так вы с hVostt в одной компании? :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911346
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hexag0v
skyANA
пропущено...
Наоборот есть.
Продуктам нашей компании 14 с лишним лет.

Так вы с hVostt в одной компании? :)
Нет.
Просто то, что вы назвали "когда нужно CI/CD и Web API добавить в большой легаси проект" не такая уж и редкость.
Многие имеют такой опыт за плечами.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911363
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mirudom
ViPRosчудик, если чек не понимает чей этот метод - агрегата, сущности или инфраструктуры, то скорее всего все эти агрегаты и сущности надуманы (текущий уровень понимания предметной области)
В нормальных системах главное - схема.
Агрегаты и независимые сущности вычислимы.
Контексты (кластеры, подсистемы) вычислимы.
Инфраструктурные методы (включая сериализации, десериализации,...) общесхемны и т.д.
Уважаемый ViPRos,
а есть где почитать подробнее про то, что Вы описываете ?
ну, на сайте vipros (можно нажать на профиль), на сайте фирмы - https://aamc.ru/vipros/
там есть доки (возможно не самые полные, но есть) по платформе, по решениям
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911365
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA
Это разработка под конкретного заказчика Алмаз-Антей.
В этой нише просто нет конкуренции.

И больше никуда этот продукт не подходит. И особо не развивается.

хехе, все ЕРП, МЕС, СРМ,... и т.д. фигня как раз конкурируют в этой нише
это огромные заводы, холдинги
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911366
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
skyANA
Это разработка под конкретного заказчика Алмаз-Антей.
В этой нише просто нет конкуренции.

И больше никуда этот продукт не подходит. И особо не развивается.

хехе, все ЕРП, МЕС, СРМ,... и т.д. фигня как раз конкурируют в этой нише
это огромные заводы, холдинги

в какой этой нише? какой процент занимает ВИПРОС? назови пяток основных конкурентов
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911368
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой рост и в чём показал продукт за последний год?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911370
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt,

читай доки, если охота - там и про импорт - экспорт метаданных со слиянием и т.д., ты бы просто посмотрел бы на механизм запуска методов (там одновременно может быть несколько версий одного и того же метода на выбор)
хорош блабла, то что вы делаете вручную (все жестко прибито в коде, потому мучаетесь с рефакторингом при малейшем изменении) в ВИПРОС автоматизировано
просто сложно такие системы внедрить и поддерживать, это же не записная книжка для любителей "желтых альбатросов"
тот же САП по 10-15 лет внедряют, а все еще не выходят за уровень финансовой отчетности и HR
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911371
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
ViPRos
пропущено...

хехе, все ЕРП, МЕС, СРМ,... и т.д. фигня как раз конкурируют в этой нише
это огромные заводы, холдинги

в какой этой нише? какой процент занимает ВИПРОС? назови пяток основных конкурентов

ну, допустим "Управление производством" машиностроительного завода - Аспрова, Преактор, Фобос,...
тебе же это ни о чем не говорит?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911372
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так то можно заявить, что ВИПРОС вполне успешно на мировом рынке систем управления производством вооружения конкурирует :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911373
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
какой рост и в чём показал продукт за последний год?

за последний год основной продукт (ВИП.Производство) внедряется (5 этапов сданы, идет последний 6 этап) на Стреле, ГОЗ и НМЗ - предварительные работы
ты представляешь что это за монстры?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911374
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Так то можно заявить, что ВИПРОС вполне успешно на мировом рынке систем управления производством вооружения конкурирует :)

не с кем конкурировать, никто не может делать то, что делает ВИПРОС, не за красивые глаза бабки платят
"вооружение" тут не при чем (частный случай) - "система управления дискретным производством"
еще больше - "процессно - проектные системы"
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911375
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
Дмитрий Мух
какой рост и в чём показал продукт за последний год?

за последний год основной продукт (ВИП.Производство) внедряется (5 этапов сданы, идет последний 6 этап) на Стреле, ГОЗ и НМЗ - предварительные работы
ты представляешь что это за монстры?
Опять производство вооружения.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911376
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
Дмитрий Мух
Так то можно заявить, что ВИПРОС вполне успешно на мировом рынке систем управления производством вооружения конкурирует :)

не с кем конкурировать, никто не может делать то, что делает ВИПРОС, не за красивые глаза бабки платят
"вооружение" тут не при чем (частный случай) - "система управления дискретным производством"
еще больше - "процессно - проектные системы"

А по факту только вооружение. Где ещё?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911378
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И всё это по факту Алмаз-Антей. Какая прям здоровая конкуренция :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911379
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Дмитрий Мух#22054530]
ViPRos

А по факту только вооружение. Где ещё?

Ты вроде умный малый, а тупишь как никто - да я не продаю ВИПРОС, ВИП.Производство,....
АА считает что
1. бизнес по части ПО не ее
2. ВИПРОС, ВИП.Производство,.... - конкурентное преимущество (изначально было сказано что ВИПРОС не будет продаваться, потом вроде разрешили, но структуру продажную никто не создал)
3. Я, как автор, естественно хочу что бы продавались мои проги, а воще пофиг - материальной выгоды никакой, а просто хвалить у нас не любят
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911380
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
И всё это по факту Алмаз-Антей. Какая прям здоровая конкуренция :)

да что бы поймать ОДИН такой завод для какой нить САП, СИМЕНС и т.д. - выдающееся достижение
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911385
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
Дмитрий Мух

А по факту только вооружение. Где ещё?

Ты вроде умный малый, а тупишь как никто - да я не продаю ВИПРОС, ВИП.Производство,....
АА считает что
1. бизнес по части ПО не ее
2. ВИПРОС, ВИП.Производство,.... - конкурентное преимущество (изначально было сказано что ВИПРОС не будет продаваться, потом вроде разрешили, но структуру продажную никто не создал)
3. Я, как автор, естественно хочу что бы продавались мои проги, а воще пофиг - материальной выгоды никакой, а просто хвалить у нас не любят

Где я туплю-то?
ВИПРОС - внутренняя разработка Алмаз-Антей под свои нужды.
Внедряемая на предприятиях концерна.
На открытом рынке программного обеспечения его нет и никому это на фиг не надо.

Типичный внутрикорпоративный софт.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911386
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
Дмитрий Мух
И всё это по факту Алмаз-Антей. Какая прям здоровая конкуренция :)

да что бы поймать ОДИН такой завод для какой нить САП, СИМЕНС и т.д. - выдающееся достижение

ну да, у них же нет контрольного пакета акций НМЗ :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911389
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух

ну да, у них же нет контрольного пакета акций НМЗ :)

прежде чем выбрать ВИПРОС, были проведен независимый аудит систем (ты кажется думаешь, что в НМЗ и т.д. щи хлебают лаптями)
вощем, тупой ты или злобствуешь не по делу
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911394
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
Дмитрий Мух

ну да, у них же нет контрольного пакета акций НМЗ :)

прежде чем выбрать ВИПРОС, были проведен независимый аудит систем (ты кажется думаешь, что в НМЗ и т.д. щи хлебают лаптями)
вощем, тупой ты или злобствуешь не по делу
Я не злобствую, просто реалист.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911399
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
ВИПРОС - внутренняя разработка Алмаз-Антей под свои нужды.
Внедряемая на предприятиях концерна.
На открытом рынке программного обеспечения его нет и никому это на фиг не надо.

Типичный внутрикорпоративный софт.

а что из этого НЕ верно?
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911453
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте с Випросом в другую ветку
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911464
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
читай доки, если охота - там и про импорт - экспорт метаданных со слиянием и т.д., ты бы просто посмотрел бы на механизм запуска методов (там одновременно может быть несколько версий одного и того же метода на выбор)
хорош блабла, то что вы делаете вручную (все жестко прибито в коде, потому мучаетесь с рефакторингом при малейшем изменении) в ВИПРОС автоматизировано
просто сложно такие системы внедрить и поддерживать, это же не записная книжка для любителей "желтых альбатросов"
тот же САП по 10-15 лет внедряют, а все еще не выходят за уровень финансовой отчетности и HR


Импорт/экспорт, ну естественно :)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911560
mirudom
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRosну, на сайте vipros (можно нажать на профиль), на сайте фирмы - https://aamc.ru/vipros/
там есть доки (возможно не самые полные, но есть) по платформе, по решениям Ок, спасибою
Еще вопрос, ежели вопросы появятся, есть ли возможность задать и где ?

Уважаемый ViPRos еще,
народ иногда зарабатывает деньги или от процесса или от результата оного, ну и соответственно,
процесс делают бесконечным или все равно каким путем достигнут результат и особенно,
интерпретация достижения результата забавляет ну, в современных условиях конечно.
У рынка есть очень важная характеристика - его ограниченность, и просто так Вас всякие шаромыжники на него не пуустят. :-)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911598
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mirudom,

вопросы можно задавать на sql.ru :) так как больше негде
а рынки меня мало беспокоят, я - наемный работник
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911601
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt

Импорт/экспорт, ну естественно :)

а як ж, надо было брокер метаданных какой нить на облаках, типа все публикуют свои изменения, а подписчики синхронизируются и в конце каждого цикла фейерверк и салюты
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911709
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos
hVostt

Импорт/экспорт, ну естественно :)

а як ж, надо было брокер метаданных какой нить на облаках, типа все публикуют свои изменения, а подписчики синхронизируются и в конце каждого цикла фейерверк и салюты


Ну почему же, вовсе нет. Микросервисы. Коли у тебя центр информационной вселенной это мета-данные, то мог бы существовать отдельный сервис мета-данных, полностью независимый. К нему сервисы данных и проекций. А далее сервисы, заточенные под конкретные нужды, которые работают независимо и решают задачу самым эффективным для конкретной задачи способом.

Касательно масштабирования, при такой архитектуре хорошо подошла бы архитектура на акторах, чтобы была возможность масштабировать ядро.

В общем решения есть, и они рабочие.
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911727
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt
ViPRos
пропущено...

а як ж, надо было брокер метаданных какой нить на облаках, типа все публикуют свои изменения, а подписчики синхронизируются и в конце каждого цикла фейерверк и салюты


Ну почему же, вовсе нет. Микросервисы. Коли у тебя центр информационной вселенной это мета-данные, то мог бы существовать отдельный сервис мета-данных, полностью независимый. К нему сервисы данных и проекций. А далее сервисы, заточенные под конкретные нужды, которые работают независимо и решают задачу самым эффективным для конкретной задачи способом.

Касательно масштабирования, при такой архитектуре хорошо подошла бы архитектура на акторах, чтобы была возможность масштабировать ядро.

В общем решения есть, и они рабочие.

я тут выкладывал такую архитектуру несколько лет назад
на работе все это никому нафиг не нужно
(микросервисы и есть акторы)
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911731
ViPRos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот сохранилась в рабочих материалах какой то вариант
...
Рейтинг: 0 / 0
DDD разнесение кода логики по классам
    #39911768
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ViPRos,

Выглядит здраво.
Но без HLD схемы выглядит это как монолит.
В схеме нет политик и правил.
В общем, есть над чем поработать.
...
Рейтинг: 0 / 0
169 сообщений из 169, показаны все 7 страниц
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / DDD разнесение кода логики по классам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]