75 lines
2.7 KiB
Markdown
75 lines
2.7 KiB
Markdown
|
---
|
|||
|
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]]
|
|||
|
**Автор**::
|
|||
|
### Дополнительные материалы
|
|||
|
-
|
|||
|
|
|||
|
### Дочерние заметки
|
|||
|
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|