ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ инвСрсии зависимостСй (Dependency Inversion Principle, DIP) гласит: высокоуровнСвыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ. Оба Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ ΠΎΡ‚ абстракций. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ вмСсто использования ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ, классы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с абстракциями β€” интСрфСйсами ΠΈΠ»ΠΈ абстрактными классами. DIP Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ, ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹ΠΌ ΠΈ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹ΠΌ.

Как ΡΠΎΠ±Π»ΡŽΠ΄Π°Ρ‚ΡŒ DIP

  1. Π Π°Π±ΠΎΡ‚Π°ΠΉΡ‚Π΅ с абстракциями: Π—Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ зависимости Π½Π° интСрфСйсы ΠΈΠ»ΠΈ абстрактныС классы.
  2. Π˜Π½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ зависимости: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ зависимостСй (Dependency Injection) Ρ‡Π΅Ρ€Π΅Π· конструктор, сСттСр ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Ρ‹.
  3. ΠœΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΆΡ‘ΡΡ‚ΠΊΡƒΡŽ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΡΡ‚ΡŒ: ВысокоуровнСвыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ нСзависимыми ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.

ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²Π° соблюдСния DIP

  1. Π“ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ: Π—Π°ΠΌΠ΅Π½Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ (Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ) Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ измСнСния высокоуровнСвых ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ.
  2. Π£Π»ΡƒΡ‡ΡˆΠ΅Π½Π½Π°Ρ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ: ВысокоуровнСвыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΊΠΎΠ² ΠΈΠ»ΠΈ Π·Π°Π³Π»ΡƒΡˆΠ΅ΠΊ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ зависят ΠΎΡ‚ абстракций.
  3. Π‘Π½ΠΈΠΆΠ΅Π½ΠΈΠ΅ связанности: ВысокоуровнСвый ΠΊΠΎΠ΄ становится нСзависимым ΠΎΡ‚ Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.
  4. Π Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΠΎΡΡ‚ΡŒ: НовыС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ интСрфСйсов ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌ ΠΊΠΎΠ΄Π΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ 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
    }
}

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС класс Switch Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ зависит ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ класса Lamp. Если потрСбуСтся Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π»Π°ΠΌΠΏΡƒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅ устройство (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вСнтилятор), придётся ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ Switch.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ интСрфСйс для абстрагирования устройств:

public interface Switchable {
    void turnOn();
}
 
public class Lamp implements Switchable {
    @Override
    public void turnOn() {
        // Π›Π°ΠΌΠΏΠ° Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π°
    }
}
 
public class Fan implements Switchable {
    @Override
    public void turnOn() {
        // ВСнтилятор Π²ΠΊΠ»ΡŽΡ‡Π΅Π½
    }
}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Switch зависит ΠΎΡ‚ интСрфСйса Switchable, Π° Π½Π΅ ΠΎΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ класса:

public class Switch {
    private Switchable device;
 
    public Switch(Switchable device) {
        this.device = device;
    }
 
    public void toggle() {
        device.turnOn(); // Π—Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ инвСрсирована β€” Switch Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с абстракциСй
    }
}

Для измСнСния устройства достаточно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ интСрфСйса Switchable ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Switch, Π½Π΅ модифицируя Π΅Π³ΠΎ ΠΊΠΎΠ΄.


ΠœΠ΅Ρ‚Π° информация

ΠžΠ±Π»Π°ΡΡ‚ΡŒ:: 00 АрхитСктура ПО
Π ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒ:: SOLID
Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ::
Π‘ΠΎΠ·Π΄Π°Π½Π°:: 2024-09-27
Автор::

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹

Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΊΠΈ