Вы говорите о сценарии, в котором зависимости должны пройти через несколько слоев объектов, чтобы добраться туда, где они действительно необходимы.Этого не должно быть.
Если объект сам создает зависимости, вы сталкиваетесь с этой проблемой.Если объектам даны зависимости, которые ему нужны от фабрики или DI-контейнера (это просто модная фабрика), у вас не будет этой проблемы.Поэтому, чтобы избежать этой проблемы, вам нужно решить, имеет ли каждый класс отношение к игровой логике или созданию классов.
Допустим, у вас есть объект a
, который вызывает объект b
, который вызывает объект c
объект c
нуждается в текущем уровне, а объект b
- нет.
Неправильный способ сделать это - вызвать new C(level);
изнутри b
.Как вы указали, b
не нужно знать об уровне, поэтому кажется, что дела становятся хуже, а не лучше.Вы не зашли достаточно далеко с внедрением зависимости.Вместо создания c
в b
, просто спросите c
в конструкторе b
.Теперь класс b
знает только о c
и ничего не знает о level
.
Миско объяснил это лучше, чем я могу здесь http://misko.hevery.com/2009/03/30/collaborator-vs-the-factory/
Код на заводе выглядит следующим образом:
Level level = new Level();
C c = new C( level );
B b = new B( c );
A a = new A( b );
Класс B знает только о своих непосредственных соавторах (c
) и не зависит от Level
.Поскольку мы создаем вещи на фабрике, нет необходимости пропускать листья графа объектов через граф объектов.
Если за создание c
отвечает класс B
, ему необходимознать все о том, как сделать экземпляр класса c
.Это не верно.