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ı:
- 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.
- 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.
- Ə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.
- 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.