d
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| d [2022/03/09 13:32] – создано chifek | d [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 принцип. | ||
| + | |||
| + | Формулировка: | ||
| + | |||
| + | // | ||
| + | Модули верхних уровней не должны зависеть от модулей нижних уровней. Оба типа модулей должны зависеть от абстракций. | ||
| + | Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.// | ||
| + | |||
| + | Или | ||
| + | |||
| + | // | ||
| + | На самом деле мы уже реализовывали этот принцип по мере изучения предыдущих | ||
| + | И чтобы не повторяться и чтобы вам было интересно приведем интересный жизненный пример.// | ||
| + | |||
| + | // | ||
| + | |||
| + | < | ||
| + | class lowRankingMale { | ||
| + | public function eat() { | ||
| + | $wife = new Wife(); | ||
| + | $food = $wife-> | ||
| + | // ... eat | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | // | ||
| + | |||
| + | < | ||
| + | class Wife { | ||
| + | public function getFood() { | ||
| + | // ... | ||
| + | return $food; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | В данной системе низкоранговый самец - экземпляр класса lowRankingMale жестко зависит от класса Wife причем у него даже нет возможности выбора. | ||
| + | Такая система крайне не гибкая и если придется вносить изменения, | ||
| + | Если мы создадим потомок класса Wife, то придется менять класс lowRankingMale и скорее всего другие иные классы, | ||
| + | |||
| + | // | ||
| + | |||
| + | < | ||
| + | class averageRankingMale { | ||
| + | |||
| + | private $wife; | ||
| + | |||
| + | public function __construct(Wife $wife) { | ||
| + | $this-> | ||
| + | } | ||
| + | |||
| + | public function eat() { | ||
| + | $food = $this-> | ||
| + | // ... eat | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | В этой системе среднеранговый самец уже по-умнее и может принимать разные экземпляры класса Wife. Но тем не менее у нас все равно остается жесткая зависимость от класса Wife и другой класс мы использовать не можем. | ||
| + | |||
| + | // | ||
| + | |||
| + | < | ||
| + | class highRankingMale { | ||
| + | |||
| + | private $foodProvider; | ||
| + | |||
| + | public function __construct(IFoodProvider $foodProvider) { | ||
| + | $this-> | ||
| + | } | ||
| + | |||
| + | public function eat() { | ||
| + | $food = $this-> | ||
| + | // ... eat | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | // | ||
| + | |||
| + | < | ||
| + | interface IFoodProvider { | ||
| + | public function getFood(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | // | ||
| + | |||
| + | < | ||
| + | class Restaurant implements IFoodProvider { | ||
| + | public function getFood() { | ||
| + | // ... | ||
| + | return $food; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | // | ||
| + | |||
| + | < | ||
| + | class Wife implements IFoodProvider{ | ||
| + | public function getFood() { | ||
| + | // ... | ||
| + | return $food; | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | А вот уже высокоранговый самец (highRankingMale) имеет полную свободу. Он не привязан ни к какому классу, | ||
| + | И для того чтобы удовлетворить потребность в еде, он может выбрать любой объект класса который реализовывает интерфейс IFoodProvider. | ||
| + | |||
| + | Выбирайте высокоранговый путь, друзья - и в коде и в жизни! )))) | ||
d.1646832754.txt.gz · Last modified: 2023/09/14 06:06 (external edit)