Sobes.tech
Middle

Pověz o principu závislostí v SOLID, který odpovídá písmenu D.

sobes.tech AI

Odpověď od AI

Princip principu závislosti (Dependency Inversion Principle, DIP).

Moduly vysoké úrovně by nem měly záviset na modulech nízké úrovně. Oba by měly záviset na abstrakcích. Abstrakce by neměly záviset na detailech. Detaily by měly záviset na abstrakcích.

Cílem principu je snížit propojení mezi komponentami, čímž se systém stává flexibilnějším, lépe testovatelným a škálovatelnějším.

Příklad v Swift:

Špatně:

class UserRepository {
    func getAllUsers() -> [User] {
        // Logika pro získání uživatelů z konkrétní databáze nebo sítě
        // ...implementace...
        return []
    }
}

class UserService {
    private let repository = UserRepository() // Přímá závislost na konkrétní implementaci

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

Dobře (s použitím DIP):

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

// Nízká úroveň modulu (implementace abstrakce)
class ConcreteUserRepository: UserRepositoryProtocol {
    func getAllUsers() -> [User] {
        // Logika získání uživatelů (detaily implementace)
        // ...implementace...
        return []
    }
}

// Vyšší úroveň modulu závisí na abstrakci
class UserService {
    private let repository: UserRepositoryProtocol // Závislost na abstrakci

    init(repository: UserRepositoryProtocol) {
        self.repository = repository // Injekce závislosti
    }

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

// Sestavení závislostí (lépe v DI kontejneru)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)

Zde UserService (modul vysoké úrovně) přímo nezávisí na ConcreteUserRepository (nízké úrovně), ale závisí na abstrakci UserRepositoryProtocol. ConcreteUserRepository také závisí na této abstrakci a ji implementuje. Závislost je "obrácena" — místo aby vysoká úroveň závisela na nízké, obě závisí na abstrakci.