Size: a a a

Software Design/Architecture/Zen

2020 December 27

VA

Vladimir Alexeev in Software Design/Architecture/Zen
Aleksander L
Я правильно понял, ты хочешь понять мысли по поводу богатой и анемичной модели?
Да, в том числе
источник

VA

Vladimir Alexeev in Software Design/Architecture/Zen
И насколько rich модель распространена в наши дни
источник

AL

Aleksander L in Software Design/Architecture/Zen
Vladimir Alexeev
И насколько rich модель распространена в наши дни
Богатая модель редко используется. И наверное в микросервисах ее вообще почти не используют.
источник

ЕР

Евгений Ромашкан... in Software Design/Architecture/Zen
Vladimir Alexeev
Интересны ваши мысли касаемо следующего дебата.
По сути, большая часть MVCшных (и не только) приложений являются процедурными. У нас есть структуры, в частности, дто и бизнес-сущности. Сперва мы получаем их из контроллера, вытягиваем их через геттеры и передаем слой бизнес-логики. Там уже, как правило, происходит извлечение соответствующей сущности из базы, над которой впоследствии также выполняются операции с использованием её аксессоров. Потом сущность, возможно, передается в dao-слой, где из неё вытягиваются свойства и куда-то персистятся. Ну и всё тоже обычно справедливо и в обратную сторону - клиенту нужно что-то вернуть.
Только вот инкапсуляции тут ни грамма. IoC вынуждает нас создавать статический граф стейтлесс объектов, которым передаются дата-модели для дальнейшей обработки. Инкапсулировать операции в объектах, создаваемых явно через new, становится намного сложнее из-за того, что им нужно передавать IoC зависимости, которые нужно либо вытягивать из контекста, либо дублировать в классе, порождающем объект, либо выкручиваться как-то иначе.
Инверсия контроля по сути инвертирует ключевую идею ООП, и в таких приложениях класс нельзя назвать сочетанием данных и операций над ними. По сути, приложения ничем не отличаются от классических сишных наборов процедур и структур. А как вы находите компромисс в этой ситуации?
В рич модель не  надо ничего инъектить
источник

AL

Aleksander L in Software Design/Architecture/Zen
Aleksander L
Богатая модель редко используется. И наверное в микросервисах ее вообще почти не используют.
Идея кажется прикольной, но когда для подсчет количества яблок на дереве приходится иметь дело со всем лесом, становится не так-то прикольно.
И когда приходится работать над производительностью приложения, то использование богатой модели может сыграть злую шутку
источник

ЕР

Евгений Ромашкан... in Software Design/Architecture/Zen
Евгений Ромашкан
В рич модель не  надо ничего инъектить
И это ответ на всю твою простыню
источник

ЕР

Евгений Ромашкан... in Software Design/Architecture/Zen
Можно инъектить всякие штуки в миддлвари/контроллер, иметь там всякую логику уровня приложения. Можно даже сущность прокидывать резолвером, а не таскать репозиторий, но сущность отвечает за так логику, что касается непосредственно её стейта
источник

ЕР

Евгений Ромашкан... in Software Design/Architecture/Zen
Проектировать сущности так, чтобы данные в них были те, что нужны для принятия решений
источник

ЕР

Евгений Ромашкан... in Software Design/Architecture/Zen
А не по тому как оно на ui выводиться. Собрать данные для ui/отчётов можно 100500 разных способов
источник

VA

Vladimir Alexeev in Software Design/Architecture/Zen
Евгений Ромашкан
В рич модель не  надо ничего инъектить
Как мне передавать внешние компоненты в рич-модель? Они туда сами «заинжектятся»? Скажем:

- Внешние зависимости
- Контейнеры данных
- Кеширование

Message message = new Message(client);

message.send()

Я не говорю, что туда нужно что-то инжектить в том смысле этого слова, который навязан IoC фреймворками. Я говорю о передаче сторонних компонентов, в том числе stateful
источник

ЕР

Евгений Ромашкан... in Software Design/Architecture/Zen
Vladimir Alexeev
Как мне передавать внешние компоненты в рич-модель? Они туда сами «заинжектятся»? Скажем:

- Внешние зависимости
- Контейнеры данных
- Кеширование

Message message = new Message(client);

message.send()

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

AK

Aleh Kashnikau in Software Design/Architecture/Zen
кеширование это особенно не про рич модель или предметную область, если конечно ваша предметная область не кеширование
источник

ЕР

Евгений Ромашкан... in Software Design/Architecture/Zen
Вложенные сущности/VO могут быть, это разруливает ORM
источник

a

atcq (Алексей)... in Software Design/Architecture/Zen
Евгений Ромашкан
Не нужны там, ни внешние зависимости, ни контейнеры данных, ни кэширование)
а может проще дать ссылку на хорошую книгу/статью по rich model?
источник

ЕР

Евгений Ромашкан... in Software Design/Architecture/Zen
Vladimir Alexeev
Как мне передавать внешние компоненты в рич-модель? Они туда сами «заинжектятся»? Скажем:

- Внешние зависимости
- Контейнеры данных
- Кеширование

Message message = new Message(client);

message.send()

Я не говорю, что туда нужно что-то инжектить в том смысле этого слова, который навязан IoC фреймворками. Я говорю о передаче сторонних компонентов, в том числе stateful
Если надо принять решение о том чтобы, условно, отправить смс юзеру - два варианта: делать это таки в контроллере(сервисе/юзкейсе), либо развернуть зависимости через доменные ивенты
источник

ЕР

Евгений Ромашкан... in Software Design/Architecture/Zen
atcq (Алексей)
а может проще дать ссылку на хорошую книгу/статью по rich model?
Не знаю таких)
источник

a

atcq (Алексей)... in Software Design/Architecture/Zen
Евгений Ромашкан
Не знаю таких)
я тоже, сам бы почитал
источник

VA

Vladimir Alexeev in Software Design/Architecture/Zen
Евгений Ромашкан
Если надо принять решение о том чтобы, условно, отправить смс юзеру - два варианта: делать это таки в контроллере(сервисе/юзкейсе), либо развернуть зависимости через доменные ивенты
Про domain events почитаю, спасибо.
Если делать это в контроллере, это будет выглядеть как:

smsGateway.send(user.getPhoneNumber(), ”Text”)?

Я правильно понял твою идею?
источник

ЕР

Евгений Ромашкан... in Software Design/Architecture/Zen
Vladimir Alexeev
Про domain events почитаю, спасибо.
Если делать это в контроллере, это будет выглядеть как:

smsGateway.send(user.getPhoneNumber(), ”Text”)?

Я правильно понял твою идею?
Если в контроллере то да, так
источник

ЕР

Евгений Ромашкан... in Software Design/Architecture/Zen
Ну либо user.sendMsg(msgSender)
источник