Sobes.tech
Middle

V čem spočívá rozdíl mezi inverzí řízení (IoC) a vkládáním závislostí?

sobes.tech AI

Odpověď od AI

Obrácení řízení (IoC) je obecný návrhový princip, podle kterého se mění tok řízení programu: místo explicitního řízení závislostí a logiky jejich volání se komponenta spoléhá na externí rámec nebo kontejner, který tento tok řídí.

Vkládání závislostí (DI) je jeden z konkrétních vzorů, které implementují princip IoC. Spočívá v předání závislostí (objektů, na kterých závisí aktuální komponenta) komponentě zvenčí, místo aby je komponenta sama vytvářela nebo hledala.

Tedy, DI je způsob, jak dosáhnout IoC.

Hlavní rozdíly:

  • IoC — princip/koncepce.
  • DI — vzor/implementace.
  • IoC může být realizováno různými způsoby (například továrním vzorem, lokalizátorem služeb), DI je jedním z těchto způsobů.
  • IoC přesouvá odpovědnost za tvorbu a spojování objektů z komponenty na rámec nebo kontejner.
  • DI realizuje tento přesun předáváním závislostí přes konstruktor, setter nebo rozhraní.

Příklad DI (konstruktor):

// třída závislá na Service
public class Client {
    private final Service service;

    // Konstruktor přijímá závislost (Service)
    public Client(Service service) {
        this.service = service;
    }

    public void doSomething() {
        service.execute();
    }
}

// rozhraní závislosti
public interface Service {
    void execute();
}

// konkrétní implementace závislosti
public class ServiceImpl implements Service {
    @Override
    public void execute() {
        System.out.println("Provádím službu...");
    }
}

// třída odpovědná za "vložení"
public class AppConfig {
    public static void main(String[] args) {
        Service myService = new ServiceImpl(); // vytvoření závislosti
        Client client = new Client(myService); // vložení závislosti přes konstruktor
        client.doSomething();
    }
}

V tomto příkladu třída Client přímo nevytváří ServiceImpl. Místo toho je ServiceImpl vytvořen jinde (AppConfig) a předán (vložen) do Client přes jeho konstruktor. To realizuje princip IoC, protože řízení tvorby a spojování Service je invertováno — není v Client.