Sobes.tech
Junior

Кайчылык интеграциясы эмне жана кандай пайдасы бар?

sobes.tech AI

AIден жооп

Тескери киргизүү (Dependency Injection, DI) — бул дизайн үлгүсү, анда компоненттер сырттан көз карандылыктарды алат, өзү түзбөйт. Бул Inversion of Control (IoC) принциптеринин бири.

DIнин пайдасы:

  1. Тестирлөөнү жакшыртуу: Модулдук тестирлөөдө көз карандылыктар үчүн mock/stub коюу оңой.
  2. Жумшак байланыш (Loose Coupling): Компоненттер конкреттүү реализациялардан аз көз каранды болот.
  3. Иштөөнүн ийкемдүүлүгү жана кеңейтилиштиги: Көз карандылыктардын реализацияларын оңой алмаштыруу негизги кодду өзгөртпөстөн.
  4. Окуулушу жана тейлөө оңойлугу: Кандай көз карандылыктар керек экендиги ачык көрүнөт.

DIнин мисалдары:

DI жок жана DI менен:

DI жок:

// Өзүнөн көз карандылыкты түзгөн класс
public class ServiceA {
    private DatabaseConnection dbConnection;

    public ServiceA() {
        // күчтүү байланыш: так реализацияны түзөбүз
        this.dbConnection = new OracleConnection(); 
    }

    public void doSomething() {
        dbConnection.connect();
        // ...
    }
}

DI менен (конструктор аркылуу):

// көз карандылык интерфейси
public interface DatabaseConnection {
    void connect();
    void disconnect();
}

// ар кандай реализациялар
public class OracleConnection implements DatabaseConnection {
    @Override
    public void connect() {
        System.out.println("Oracleго туташуу...");
    }
    @Override
    public void disconnect() {
        System.out.println("Oracleдон ажыроо...");
    }
}

public class MySQLConnection implements DatabaseConnection {
    @Override
    public void connect() {
        System.out.println("MySQLго туташуу...");
    }
    @Override
    public void disconnect() {
        System.out.println("MySQLдон ажыроо...");
    }
}

// тыштан көз карандылыкты алгандар класс
public class ServiceB {
    private DatabaseConnection dbConnection;

    // конструктор аркылуу көз карандылыкты киргизүү
    public ServiceB(DatabaseConnection dbConnection) {
        this.dbConnection = dbConnection;
    }

    public void doSomething() {
        dbConnection.connect();
        // ...
    }

    public void setDbConnection(DatabaseConnection dbConnection) {
        this.dbConnection = dbConnection;
    }
}

// конфигурация коду
public class Application {
    public static void main(String[] args) {
        // көз карандылыкты түзүү
        DatabaseConnection connection = new MySQLConnection(); 
        // көз карандылыкты ServiceBге киргизүү
        ServiceB service = new ServiceB(connection); 
        service.doSomething();

        // же көз карандылыкты өзгөртүү, ServiceB өзгөртүүсүз
        DatabaseConnection anotherConnection = new OracleConnection();
         ServiceB anotherService  = new ServiceB(anotherConnection);
         anotherService.doSomething();
    }
}

Киргизүү ыкмалары:

  • Конструктор аркылуу (Constructor Injection): көз карандылыктар класс конструктору аркылуу берилет. Мажбурлук көз карандылыктар үчүн артыкчылык.
  • Setter аркылуу (Setter Injection): көз карандылыктар сеттер аркылуу берилет. Ыңгайлуу тандалган көз карандылыктар үчүн.
  • Кырдаал аркылуу (Field Injection): көз карандылыктар түз эле класс талааларында киргизилет (адатта frameworkтер менен, рефлексия талап кылынат). DI frameworkтерсиз сунушталбайт, анткени тестирлөөнү кыйындатат жана көз карандылыктарды жашырат.

DI көбүнчө Spring, Guice, Dagger сыяктуу DI контейнерлери/фреймворктөр менен ишке ашырылат, алар объекттердин жашоо циклин башкарат жана киргизүү процесин автоматташтырат.