… DIP или “Принцип инверсии зависимостей”
Этот принцип гласит:
- Высокоуровневые модули не должны зависеть от низкоуровневых. Оба вида должны зависеть от абстракций.
- Абстракции не должны зависеть от деталей.
- Детали должны зависеть от абстракций.
Сначала это может быть трудным для понимания, но если вы работали с PHP-фреймворками (вроде Symfony), то уже встречались с реализацией этого принципа в виде инъекции зависимости (Dependency Injection, DI).
Однако эти принципы не идентичны, DI ограждает высокоуровневые модули от деталей своих низкоуровневых модулей и их настройки.
Это может быть сделано посредством DI. Огромное преимущество в том, что снижается сцепление (coupling) между модулями.
Сцепление — очень плохой шаблон разработки, затрудняющий рефакторинг кода.
Плохой пример
class Worker { public function work() { // ....working } } class Manager { /** @var Worker $worker **/ private $worker; public function __construct(Worker $worker) { $this->worker = $worker; } public function manage() { $this->worker->work(); } } class SuperWorker extends Worker { public function work() { //.... working much more } }
Хороший пример
interface WorkerInterface { public function work(); } class Worker implements WorkerInterface { public function work() { // ....working } } class SuperWorker implements WorkerInterface { public function work() { //.... working much more } } class Manager { /** @var Worker $worker **/ private $worker; public function __construct(WorkerInterface $worker) { $this->worker = $worker; } public function manage() { $this->worker->work(); } }
см. также видео Немчинского: https://www.youtube.com/embed/Bw6RvCSsETI
Источники:
Нет Ответов