Sobes.tech
Middle

Papaskokite apie priklausomybės principą SOLID, kuris atitinka raidę D.

sobes.tech AI

Atsakymas iš AI

Priešingybės priklausomybės principas (Dependency Inversion Principle, DIP).

Aukšto lygio moduliai neturi priklausyti nuo žemo lygio modulių. Abu turi priklausyti nuo abstrakcijų. Abstrakcijos neturi priklausyti nuo detalių. Detalės turi priklausyti nuo abstrakcijų.

Tikslo: sumažinti komponentų tarpusavio priklausomybę, padaryti sistemą lankstesnę, testuojamą ir mastelį.

Pavyzdys Swift:

Blogai:

class UserRepository {
    func getAllUsers() -> [User] {
        // Vartotojų gavimo logika iš konkrečios duomenų bazės ar tinklo
        // ...įgyvendinimas...
        return []
    }
}

class UserService {
    private let repository = UserRepository() // Tiesioginė priklausomybė nuo konkrečios realizacijos

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

Gera (naudojant DIP):

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

// Žemo lygio modulis (įgyvendinimas)
class ConcreteUserRepository: UserRepositoryProtocol {
    func getAllUsers() -> [User] {
        // Vartotojų gavimo logika (įgyvendinimo detalės)
        // ...įgyvendinimas...
        return []
    }
}

// Aukšto lygio modulis, priklausantis nuo abstrakcijos
class UserService {
    private let repository: UserRepositoryProtocol // Priklausomybė nuo abstrakcijos

    init(repository: UserRepositoryProtocol) {
        self.repository = repository // Injekcija
    }

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

// Priklausomybių surinkimas (gerai — DI konteineryje)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)

Čia UserService (aukšto lygio modulis) nėra tiesiogiai priklausomas nuo ConcreteUserRepository (žemo lygio modulis), o priklauso nuo abstrakcijos UserRepositoryProtocol. ConcreteUserRepository taip pat priklauso nuo abstrakcijos, ją įgyvendindamas. Priklausomybės inversija — vietoj to, kad aukšto lygio modulis priklausytų nuo žemo lygio, abu priklauso nuo abstrakcijos.