Sobes.tech
Middle

Parla del principio di dipendenza in SOLID, che corrisponde alla lettera D.

sobes.tech AI

Risposta dell'AI

Principio di inversione delle dipendenze (Dependency Inversion Principle, DIP).

I moduli di alto livello non devono dipendere dai moduli di basso livello. Entrambi devono dipendere da astrazioni. Le astrazioni non devono dipendere dai dettagli. I dettagli devono dipendere dalle astrazioni.

Obiettivo del principio: ridurre l'accoppiamento tra i componenti, rendendo il sistema più flessibile, testabile e scalabile.

Esempio in Swift:

Cattivo:

class UserRepository {
    func getAllUsers() -> [User] {
        // Logica per ottenere utenti da un database o rete specifica
        // ...implementazione...
        return []
    }
}

class UserService {
    private let repository = UserRepository() // Dipendenza diretta da un'implementazione concreta

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

Buono (applicando DIP):

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

// Modulo di basso livello (implementazione dell'astrazione)
class ConcreteUserRepository: UserRepositoryProtocol {
    func getAllUsers() -> [User] {
        // Logica per ottenere utenti (dettagli di implementazione)
        // ...implementazione...
        return []
    }
}

// Modulo di alto livello che dipende dall'astrazione
class UserService {
    private let repository: UserRepositoryProtocol // Dipendenza dall'astrazione

    init(repository: UserRepositoryProtocol) {
        self.repository = repository // Iniezione di dipendenza
    }

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

// Assemblaggio delle dipendenze (meglio farlo in un contenitore DI)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)

Qui, UserService (modulo di alto livello) non dipende direttamente da ConcreteUserRepository (modulo di basso livello), ma dipende dall'astrazione UserRepositoryProtocol. ConcreteUserRepository dipende anch'esso dall'astrazione, implementandola. La dipendenza si "inverte" — invece che il modulo di alto livello dipenda da quello di basso livello, entrambi dipendono dall'astrazione.