Шаблон наблюдателя и инверсия зависимостей

#design-patterns

#шаблоны проектирования

Вопрос:

У меня есть класс контроллера, который реализует Observer и другой класс прецедентов (называемый UseCase ) (который находится на более низком уровне чистой архитектуры), который расширяется Observable .

Если мой контроллер хранит экземпляр UseCase и вызывает useCase.addObserver(this) , нарушает ли это чистую архитектуру или это пример инверсии зависимостей?

Комментарии:

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

Ответ №1:

Принцип инверсии зависимостей (DIP) — это принцип времени разработки. Кратко изложено:

Абстракции не должны зависеть от деталей. Детали (конкретные реализации) должны зависеть от абстракций

Если рассматриваемый контроллер зависит от Observable , и мы предполагаем, что Observable это интерфейс или базовый класс, определенный на том же уровне абстракции (или выше), что и контроллер, то Контроллер зависит от абстракции.

Если я правильно понимаю OP, UseCase класс зависит от abstraction ( Observable ), потому что он его расширяет.

Все это соответствует DIP.

Тот факт, что во время выполнения Observable экземпляр like UseCase составляется с контроллером, ничего не меняет. Из-за полиморфизма контроллер не зависит от UseCase .

Предполагается, однако, что за соединение контроллера с экземпляром отвечает какая-то третья сторона. UseCase Если контроллер обновляет сам UseCase экземпляр, то DIP нарушается, потому что контроллер будет зависеть от деталей реализации ( UseCase класса).

Кроме того, если контроллер хранит экземпляр UseCase вместо Observer , то, опять же, DIP нарушается.