--- aliases: - DIP - Принцип инверсии зависимостей tags: - maturity/🌱 date: 2024-09-27 zero-link: - "[[../../meta/zero/00 Архитектура ПО|00 Архитектура ПО]]" parents: - "[[SOLID|SOLID]]" linked: --- Высокоуровневые модули не должны зависеть от низкоуровневых модулей. Оба должны зависеть от абстракций. Это означает, что классы не должны напрямую зависеть от конкретных реализаций, вместо этого они должны работать с абстракциями (интерфейсами или абстрактными классами). Это делает код гибким и легко расширяемым. - **Пример нарушения DIP**: Высокоуровневый модуль напрямую использует конкретный класс, что приводит к жёсткой связности. - **Решение**: Заменить зависимости на интерфейсы и внедрять зависимости через инверсии (например, через конструктор или контейнеры зависимостей). ```java 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 } } ``` Исправление с использованием интерфейсов: ```java 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 Архитектура ПО|00 Архитектура ПО]] **Родитель**:: [[SOLID]] **Источник**:: **Создана**:: [[2024-09-27]] **Автор**:: ### Дополнительные материалы - ### Дочерние заметки