Как сделать объекты домена доступными для контроллеров и представлений MVC?

Как сделать объекты домена доступными для контроллеров и представлений MVC?
Как сделать объекты домена доступными для контроллеров и представлений MVC? - kenrick @ Unsplash

Резюме моего вопроса в краткой форме: Как распространять изменения доменных объектов вверх, не внедряя в них прикладную логику?

Следующие "факты" основаны на предписаниях уважаемых авторов по архитектуре программного обеспечения.

Факт 1: В многоуровневой архитектуре нижний уровень никогда не должен делать явные вызовы методов вверх.

Факт 2: Объекты, представляющие бизнес-логику, должны быть свободны от любых технических аспектов программного обеспечения. Авторы предписывают, что "Доменный слой" должен изолировать их от любых других слоев, включая любые верхние Презентационные слои.

Факт 3: В паттерне MVC механизм распространения изменений должен существовать в модели: О любых изменениях в объектах модели должны быть уведомлены все соответствующие представления и контроллеры. Для этого хорошо подходит паттерн наблюдателя.

Факт 4: В модели наблюдателя субъект (или объект-провайдер) позволяет регистрировать объекты-наблюдатели. Когда состояние субъекта изменяется, объекты-наблюдатели получают уведомления.

У меня есть уровень домена (или уровень бизнес-логики), я хочу использовать паттерн MVC, хочу использовать для него паттерн наблюдателя и хочу соблюдать факт 2: я не хочу внедрять логику наблюдателя в объекты домена.

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

Факт 1: Верно.

Факт 2: Верно в принципе. Объекты бизнес-логики должны быть «независимыми от технологии», если заявленной целью конкретного объекта не является взаимодействие с определенной технологией.

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

Факт 4: Верно. Вот как работает шаблон наблюдателя.

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


LetsCodeIt, 29 декабря 2022 г., 04:45