Высокоуровневые модули не должны зависеть от низкоуровневых модулей. Оба должны зависеть от абстракций. Это означает, что классы не должны напрямую зависеть от конкретных реализаций, вместо этого они должны работать с абстракциями (интерфейсами или абстрактными классами). Это делает код гибким и легко расширяемым.

  • Пример нарушения DIP: Высокоуровневый модуль напрямую использует конкретный класс, что приводит к жёсткой связности.
  • Решение: Заменить зависимости на интерфейсы и внедрять зависимости через инверсии (например, через конструктор или контейнеры зависимостей).
public class Lamp {
    public void turnOn() {
        // Лампа включена
    }
}
 
public class Switch {
    private Lamp lamp;
 
    public Switch(Lamp lamp) {
        this.lamp = lamp;
    }
 
    public void toggle() {
        lamp.turnOn(); // Нарушение DIP — жесткая зависимость от класса Lamp
    }
}

Исправление с использованием интерфейсов:

public interface Switchable {
    void turnOn();
}
 
public class Lamp implements Switchable {
    public void turnOn() {
        // Лампа включена
    }
}
 
public class Switch {
    private Switchable device;
 
    public Switch(Switchable device) {
        this.device = device;
    }
 
    public void toggle() {
        device.turnOn(); // Теперь зависимость инверсирована — Switch зависит от абстракции
    }
}

Мета информация

Область:: 00 Архитектура ПО
Родитель:: SOLID
Источник::
Создана:: 2024-09-27
Автор::

Дополнительные материалы

Дочерние заметки