#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 нарушается.