Sobes.tech
Junior

Asılı inteqrasiya nədir və hansı faydalar gətirir?

sobes.tech Süni İntellekt

AI-dan cavab

Asılılıq Quraşdırılması (Dependency Injection, DI) — bu dizayn nümunəsidir, burada komponentlər asılılıqları xaricdən alır, özləri yaratmır. Bu, İstiqamət İdarəetməsinin (Inversion of Control, IoC) prinsiplərindən biridir.

DI-nin faydaları:

  1. Test ediləbilənliyin yaxşılaşdırılması: Modulların testində asılılıqlar üçün mock/loklar asanlıqla yerləşdirilə bilər.
  2. Yumşaq bağlılıq (Loose Coupling): Komponentlər asılılıqların konkret həyata keçirilməsindən daha az asılıdır.
  3. Əlavə çevik və genişlənə bilənlik: Asılılıqların həyata keçirilməsini asanlıqla dəyişmək olar, əsas kodu dəyişdirmədən.
  4. Oxunma və dəstək asanlığı: Komponentin hansı asılılıqlara ehtiyacı olduğu aydın görünür.

DI olmadan və DI ilə nümunələr:

DI olmadan:

// Asılılığı özündə yaradan sinif
public class ServiceA {
    private DatabaseConnection dbConnection;

    public ServiceA() {
        // Güclü bağlılıq: konkret həyata keçirilməni açıq şəkildə yaradırıq
        this.dbConnection = new OracleConnection(); 
    }

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

DI ilə (konstruktor vasitəsilə):

// Asılılıq interfeysi
public interface DatabaseConnection {
    void connect();
    void disconnect();
}

// Müxtəlif həyata keçirilmələr
public class OracleConnection implements DatabaseConnection {
    @Override
    public void connect() {
        System.out.println("Oracle-ə qoşulur...");
    }
    @Override
    public void disconnect() {
        System.out.println("Oracle-dan ayırılır...");
    }
}

public class MySQLConnection implements DatabaseConnection {
    @Override
    public void connect() {
        System.out.println("MySQL-ə qoşulur...");
    }
    @Override
    public void disconnect() {
        System.out.println("MySQL-dan ayırılır...");
    }
}

// Asılılığı xaricdən alan sinif
public class ServiceB {
    private DatabaseConnection dbConnection;

    // Konstruktor vasitəsilə asılılıq
    public ServiceB(DatabaseConnection dbConnection) {
        this.dbConnection = dbConnection;
    }

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

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

// Konfiqurasiya edən kod
public class Application {
    public static void main(String[] args) {
        // Asılılığı yaradırıq
        DatabaseConnection connection = new MySQLConnection(); 
        // Asılılığı ServiceB-ə yerləşdiririk
        ServiceB service = new ServiceB(connection); 
        service.doSomething();

        // Yaxud asılılığı dəyişirik, ServiceB-ni dəyişdirmədən
        DatabaseConnection anotherConnection = new OracleConnection();
         ServiceB anotherService  = new ServiceB(anotherConnection);
         anotherService.doSomething();
    }
}

Yerləşdirmə üsulları:

  • Konstruktor vasitəsilə (Constructor Injection): Asılılıqlar sinifin konstruktoru vasitəsilə verilir. Zəruri asılılıqlar üçün üstünlük verilən yoldur.
  • Setter vasitəsilə (Setter Injection): Asılılıqlar metodlar vasitəsilə verilir. İxtiyari asılılıqlar üçün uyğundur.
  • Sahə vasitəsilə (Field Injection): Asılılıqlar birbaşa sinif sahələrinə yerləşdirilir (adətən çərçivələrlə istifadə olunur, refleksiya tələb edir). DI çərçivələri olmadan tövsiyə edilmir, çünki test və asılılıqların gizlənməsini çətinləşdirir.

DI tez-tez Spring, Guice, Dagger kimi DI konteynerləri/çərçivələri ilə həyata keçirilir, bunlar obyektlərin həyat dövrünü idarə edir və yerləşdirmə prosesini avtomatlaşdırır.