Sobes.tech
Middle

Mis on kontrolli pööramise (IoC) ja sõltuvuste süstimise vahe?

sobes.tech AI

Vastus AI-lt

Juhtimise inversioon (IoC) — see on üldine disainiprintsiip, mille kohaselt programmijooks muutub: selle asemel, et selgelt juhtida sõltuvusi ja nende kutsumise loogikat, tugineb komponent välisele raamistikule või konteinerile, mis juhib seda voogu.

Sõltuvuste sisestamine (DI) on üks konkreetne muster, mis realiseerib IoC printsiipi. See seisneb sõltuvuste (objektide, millest sõltub praegune komponent) edastamises komponendile väljastpoolt, selle asemel, et komponent neid ise loob või otsib.

Seega, DI on viis saavutada IoC.

Peamised erinevused:

  • IoC — printsiip/kontseptsioon.
  • DI — muster/realiseerimine.
  • IoC võib olla realiseeritud erinevatel viisidel (näiteks tehase meetod, teenuste otsija), DI on üks sellistest viisidest.
  • IoC nihutab vastutuse objektide loomise ja sidumise komponendist raamistikule/konteinerile.
  • DI realiseerib selle nihke, edastades sõltuvused konstruktoriga, setteriga või liidesega.

Näide DI-st (konstruktoriga):

// klass, mis sõltub Service-st
public class Client {
    private final Service service;

    // Konstruktor võtab sõltuvuse (Service)
    public Client(Service service) {
        this.service = service;
    }

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

// sõltuvuse liides
public interface Service {
    void execute();
}

// konkreetne sõltuvuse realiseerimine
public class ServiceImpl implements Service {
    @Override
    public void execute() {
        System.out.println("Teenuse täitmine...");
    }
}

// klass, mille ülesandeks on "sissejuhatus"
public class AppConfig {
    public static void main(String[] args) {
        Service myService = new ServiceImpl(); // sõltuvuse loomine
        Client client = new Client(myService); // sõltuvuse sisestamine konstruktoriga
        client.doSomething();
    }
}

Selles näites ei loo Client klass otse ServiceImpl-i. Selle asemel luuakse ServiceImpl kuskil mujal (AppConfig) ja antakse (sisestatakse) Client-ile läbi selle konstruktor. See realiseerib IoC printsiibi, kuna juhtimine Service loomise ja sidumise osas on pööratud — see ei ole Client-is.