Sobes.tech
Middle

SOLIDdagi bog'liqlik prinsipi haqida, D harfiga mos keladigan prinsip haqida gapiring.

sobes.tech AI

AIdan javob

Bağımlılıkların Ters Çevirisi Prinsipi (Dependency Inversion Principle, DIP).

Yüksək səviyyəli modullar aşağı səviyyəli modullardan asılı olmamalıdır. Hər ikisi də abstraksiyalara asılı olmalıdır. Abstraksiyalar detallara asılı olmamalıdır. Detallar abstraksiyalara asılı olmalıdır.

Prinsipin məqsədi: komponentlər arasındakı əlaqəni azaltmaq, sistemi daha çevik, test edilə bilən və miqyaslana bilən etmək.

Swift-də nümunə:

Pis:

class UserRepository {
    func getAllUsers() -> [User] {
        // Müəyyən bir verilənlər bazasından və ya şəbəkədən istifadəçiləri almaq üçün məntiq
        // ...implementasiya...
        return []
    }
}

class UserService {
    private let repository = UserRepository() // Birbaşa konkret implementasiyaya asılılıq

    func fetchUsers() -> [User] {
        return repository.getAllUsers()
    }
}

Yaxşı (DIP tətbiq edilərək):

// Abstraksiya
protocol UserRepositoryProtocol {
    func getAllUsers() -> [User]
}

// Aşağı səviyyəli modul (abstraksiyanın implementasiyası)
class ConcreteUserRepository: UserRepositoryProtocol {
    func getAllUsers() -> [User] {
        // İstifadəçiləri almaq üçün məntiq (implementasiya detalları)
        // ...implementasiya...
        return []
    }
}

// Yüksək səviyyəli modul, abstraksiyaya bağlı
class UserService {
    private let repository: UserRepositoryProtocol // Abstraksiyaya bağlılıq

    init(repository: UserRepositoryProtocol) {
        self.repository = repository // Bağlama (injection)
    }

    func fetchUsers() -> [User] {
        return repository.getAllUsers()
    }
}

// Bağlamaların qurulması (daha yaxşı DI konteynerində edilə bilər)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)

Burada, UserService (yüksək səviyyəli modul) birbaşa ConcreteUserRepository (aşağı səviyyəli modul) ilə bağlı deyil, onun yerinə UserRepositoryProtocol abstraksiyasına bağlıdır. ConcreteUserRepository də abstraksiyaya bağlıdır və onu həyata keçirir. Bağlama "əksinə çevrilir" — yüksək səviyyəli modul aşağı səviyyəli modulə bağlı olmaq yerinə, hər ikisi abstraksiyaya bağlıdır.