Sobes.tech
Middle

Vorbește despre principiul dependenței în SOLID, care corespunde literei D.

sobes.tech AI

Răspuns de la AI

Principiul inversiunii dependențelor (Dependency Inversion Principle, DIP).

Modulele de nivel înalt nu trebuie să depindă de modulele de nivel scăzut. Ambele trebuie să depindă de abstracții. Abstracțiile nu trebuie să depindă de detalii. Detaliile trebuie să depindă de abstracții.

Scopul principiului: reducerea cuplajului între componente, făcând sistemul mai flexibil, testabil și scalabil.

Exemplu în Swift:

Greșit:

class UserRepository {
    func getAllUsers() -> [User] {
        // Logica de obținere a utilizatorilor dintr-o bază de date sau rețea specifică
        // ...implementare...
        return []
    }
}

class UserService {
    private let repository = UserRepository() // Dependență directă de o implementare concretă

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

Corect (aplicând DIP):

// Abstracție
protocol UserRepositoryProtocol {
    func getAllUsers() -> [User]
}

// Modul de nivel scăzut (implementarea abstracției)
class ConcreteUserRepository: UserRepositoryProtocol {
    func getAllUsers() -> [User] {
        // Logica de obținere a utilizatorilor (detalii de implementare)
        // ...implementare...
        return []
    }
}

// Modul de nivel înalt, dependent de abstracție
class UserService {
    private let repository: UserRepositoryProtocol // Dependență de abstracție

    init(repository: UserRepositoryProtocol) {
        self.repository = repository // Injectarea dependenței
    }

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

// Configurarea dependențelor (mai bine în un container DI)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)

Aici, UserService (modul de nivel înalt) nu depinde direct de ConcreteUserRepository (modul de nivel scăzut), ci depinde de abstracția UserRepositoryProtocol. ConcreteUserRepository depinde și ea de abstracție și o implementează. Dependența "se inversează" — în loc ca modul de nivel înalt să depindă de cel de nivel scăzut, ambele depind de abstracție.