Sobes.tech
Middle

Ispričaj o principu zavisnosti u SOLID-u, koji odgovara slovu D.

sobes.tech АИ

Одговор од АИ

Princip principa inverzije zavisnosti (Dependency Inversion Principle, DIP).

Moduli visokog nivoa ne bi trebalo da zavise od modula niskog nivoa. Oba bi trebalo da zavise od apstrakcija. Apstrakcije ne bi trebalo da zavise od detalja. Detalji bi trebalo da zavise od apstrakcija.

Cilj principa: smanjenje povezanosti između komponenti, čineći sistem fleksibilnijim, testabilnijim i skalabilnijim.

Primer u Swift:

Loše:

class UserRepository {
    func getAllUsers() -> [User] {
        // Logika za dobijanje korisnika iz konkretne baze podataka ili mreže
        // ...implementacija...
        return []
    }
}

class UserService {
    private let repository = UserRepository() // Direktna zavisnost od konkretne implementacije

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

Dobro (sa primenom DIP):

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

// Nisko nivo modul (implementacija apstrakcije)
class ConcreteUserRepository: UserRepositoryProtocol {
    func getAllUsers() -> [User] {
        // Logika za dobijanje korisnika (detalji implementacije)
        // ...implementacija...
        return []
    }
}

// Visoko nivo modul koji zavisi od apstrakcije
class UserService {
    private let repository: UserRepositoryProtocol // Zavisnost od apstrakcije

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

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

// Sastavljanje zavisnosti (bolje u DI kontejneru)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)

Ovde, UserService (modul visokog nivoa) ne zavisi direktno od ConcreteUserRepository (modul niskog nivoa), već od apstrakcije UserRepositoryProtocol. ConcreteUserRepository takođe zavisi od apstrakcije i implementira je. Zavisnost se "obrtom" — umesto da visok nivo zavisi od niskog, oba zavise od apstrakcije.