Принцип DIP из SOLID

Правильно ли я понял принцип DIP из SOLID? Если класс A имеет зависимость от класса B, то при описании класса А зависимость нужно указать через абстракцию, т.е.:

interface BInterface { ... }

class B implements BInterface  { ... }

class A {
    public function __construct(BInterface  $b) { ... }
}

Если бы мы указали в зависимости, конкретно класс, вот так:

class A {
    public function __construct(B $b) { ... }
}

то это было бы нарушение принципа DIP ?


Ответы (1 шт):

Автор решения: Haku Kimura

Вы всё верно расписали, ваш второй пример нарушает принцип инверсии зависимостей, т.к. класс A полностью зависит от класса B, если вы измените в будущем класс B, то вам придётся отредактировать и другие классы. А в первом примере вы создали для класса B интерфейс BInterface и тем самым обеспечили независимость модулей разных уровней. Теперь класс A не привязан жёстко к конкретному классу, главное чтобы передаваемый объект в конструкторе реализовывал BInterface и, соответственно, принцип DIP не нарушается.

→ Ссылка