… 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
Источники:
Нет Ответов