Sobes.tech
Middle

Ի՞նչ է ինվերսիայի կառավարման (IoC) և կախվածությունների ներմուծման միջև տարբերությունը։

sobes.tech AI

Պատասխան AI-ից

Կառավարման ինվերտորություն (IoC) — դա ընդհանուր նախագծման սկզբունք է, ըստ որի ծրագրի կառավարման հոսքը փոխվում է՝ փոխարենը բացահայտորեն կառավարելու կախվածությունները և դրանց կանչման լոգիկան, բաղադրիչը հույս է դնում արտաքին ֆրեյմվորկ կամ կոնտեյներ, որը կառավարում է այդ հոսքը:

Կապակցված կախվածությունների ներդրում (DI) — դա IoC սկզբունքի մի կոնկրետ օրինակ է։ Այն բաղկացած է կախվածությունների (օբյեկտների, որոնց վրա կախված է ընթացիկ բաղադրիչը) փոխանցումից արտաքինից, փոխարենը այն ստեղծելու կամ ինքնուրույն որոնելու:

Այսպիսով, DI — դա IoC հասնելու միջոց է:

Հիմնական տարբերությունները՝

  • IoC — սկզբունք/կոնցեպցիա:
  • DI — օրինակ/իրականացում:
  • IoC կարող է իրականացվել տարբեր եղանակներով (օրինակ՝ գործարանային մեթոդ, ծառայությունների լոկատոր), իսկ DI — այդ եղանակներից մեկն է:
  • IoC տեղափոխում է պատասխանատվությունը օբյեկտների ստեղծման և կապակցման համար բաղադրիչից մասին ֆրեյմվորկ/կոնտեյներ:
  • DI իրականացնում է այս տեղափոխությունը փոխանցելով կախվածությունները կոնստրուկտորով, սեթթերով կամ ինտերֆեյսով:

Օրինակ DI (կոնստրուկտորով):

// կախված Service-ից դաս
public class Client {
    private final Service service;

    // Կոնստրուկտորը ընդունում է կախվածությունը (Service)
    public Client(Service service) {
        this.service = service;
    }

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

// կախվածության ինտերֆեյս
public interface Service {
    void execute();
}

// կախվածության կոնկրետ իրականացում
public class ServiceImpl implements Service {
    @Override
    public void execute() {
        System.out.println("ծառայության կատարմամբ...");
    }
}

// դաս, պատասխանատու "ներմուծման" համար
public class AppConfig {
    public static void main(String[] args) {
        Service myService = new ServiceImpl(); // կախվածության ստեղծում
        Client client = new Client(myService); // կախվածության ներդրում կոնստրուկտորով
        client.doSomething();
    }
}

Այս օրինակով, Client դասը չի ստեղծում ServiceImpl-ը ուղղակի։ Փոխարենը, ServiceImpl-ը ստեղծվում է ուրիշ տեղ (AppConfig) և փոխանցվում (ներմուծվում) Client-ին նրա կոնստրուկտորով։ Սա իրականացնում է IoC սկզբունքը, քանի որ կառավարման ստեղծումը և կապակցումը Service-ի՝ փոխարկված է՝ այն չի գտնվում Client-ի մեջ։