digital-garden/dev/architecture/Dependency Inversion Principle.md
Struchkov Mark 1536a6c68c
All checks were successful
continuous-integration/drone/push Build is passing
Обновление
2024-09-27 20:25:32 +03:00

2.7 KiB
Raw Blame History

aliases tags date zero-link parents linked
DIP
Принцип инверсии зависимостей
maturity/🌱
2024-09-27
../../meta/zero/00 Архитектура ПО
SOLID

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

  • Пример нарушения 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 зависит от абстракции
    }
}

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

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

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

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