User Tools

Site Tools


d

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
d [2022/03/09 13:32] – создано chifekd [2023/09/14 06:06] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Принцип инверсии зависимостей (англ. Dependency Inversion Principle, DIP). ====== ====== Принцип инверсии зависимостей (англ. Dependency Inversion Principle, DIP). ======
  
 +
 +Пятый SOLID принцип.
 +
 +Формулировка:
 +
 +//Зависимости внутри системы строятся на основе абстракций.
 +Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций.
 +Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.//
 +
 +Или
 +
 +//Зависимости должны строится относительно абстракций, а не деталей.
 +На самом деле мы уже реализовывали этот принцип по мере изучения предыдущих
 +И чтобы не повторяться и чтобы вам было интересно приведем интересный жизненный пример.//
 +
 +//husband.php://
 +
 +<code>
 +class lowRankingMale {
 +    public function eat() {
 +        $wife = new Wife();
 +        $food = $wife->getFood();
 +        // ... eat
 +    }
 +}
 +</code>
 +
 +//wife.php://
 +
 +<code>
 +class Wife {
 +    public function getFood() {
 +        // ...
 +        return $food;
 +    }
 +}
 +</code>
 +
 +
 +В данной системе низкоранговый самец - экземпляр класса lowRankingMale жестко зависит от класса Wife причем у него даже нет возможности выбора.
 +Такая система крайне не гибкая и если придется вносить изменения, то сделать это будет сложно. Если мы будем изменять класс Wife, то мы нарушим принцип Открытости/Закрытости.
 +Если мы создадим потомок класса Wife, то придется менять класс lowRankingMale и скорее всего другие иные классы, так как класс Wife может быть использован и в других классах.
 +
 +//husband.php://
 +
 +<code>
 +class averageRankingMale {
 + 
 +    private $wife;
 + 
 +    public function __construct(Wife $wife) {
 +        $this->wife = $wife;
 +    }
 + 
 +    public function eat() {
 +        $food = $this->wife->getFood();
 +        // ... eat
 +    }
 +}
 +</code>
 +
 +
 +В этой системе среднеранговый самец уже по-умнее и может принимать разные экземпляры класса Wife. Но тем не менее у нас все равно остается жесткая зависимость от класса Wife и другой класс мы использовать не можем.
 +
 +//husband.php://
 +
 +<code>
 +class highRankingMale {
 + 
 +    private $foodProvider;
 + 
 +    public function __construct(IFoodProvider $foodProvider) {
 +        $this->foodProvider = $foodProvider;
 +    }
 + 
 +    public function eat() {
 +        $food = $this->foodProvider->getFood();
 +        // ... eat
 +    }
 +}
 +</code>
 +
 +//IFoodProvider.php://
 +
 +<code>
 +interface IFoodProvider {
 +    public function getFood();
 +}
 +</code>
 +
 +//restaurant.php://
 +
 +<code>
 +class Restaurant implements IFoodProvider {
 +    public function getFood() {
 +        // ...
 +        return $food;
 +    }
 +}
 +</code>
 +
 +
 +//wife.php://
 +
 +<code>
 +class Wife implements IFoodProvider{
 +    public function getFood() {
 +        // ...
 +        return $food;
 +    }
 +}
 +</code>
 +
 +А вот уже высокоранговый самец (highRankingMale) имеет полную свободу. Он не привязан ни к какому классу, а привязан к абстракции - к набору свойств.
 +И для того чтобы удовлетворить потребность в еде, он может выбрать любой объект класса который реализовывает интерфейс IFoodProvider.
 +
 +Выбирайте высокоранговый путь, друзья - и в коде и в жизни! ))))
  
  
d.1646832754.txt.gz · Last modified: 2023/09/14 06:06 (external edit)