Sobes.tech
Middle

Opowiedz o zasadzie zależności w SOLID, która odpowiada literze D.

sobes.tech AI

Odpowiedź od AI

Zasada odwracania zależności (Dependency Inversion Principle, DIP).

Moduły wysokiego poziomu nie powinny zależeć od modułów niskiego poziomu. Oba powinny zależeć od abstrakcji. Abstrakcje nie powinny zależeć od szczegółów. Szczegóły powinny zależeć od abstrakcji.

Cel zasady: zmniejszenie powiązań między komponentami, czyniąc system bardziej elastycznym, testowalnym i skalowalnym.

Przykład w Swift:

Złe:

class UserRepository {
    func getAllUsers() -> [User] {
        // Logika pobierania użytkowników z konkretnej bazy danych lub sieci
        // ...implementacja...
        return []
    }
}

class UserService {
    private let repository = UserRepository() // Bezpośrednia zależność od konkretnej implementacji

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

Dobrze (z zastosowaniem DIP):

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

// Moduł niskiego poziomu (implementacja abstrakcji)
class ConcreteUserRepository: UserRepositoryProtocol {
    func getAllUsers() -> [User] {
        // Logika pobierania użytkowników (szczegóły implementacji)
        // ...implementacja...
        return []
    }
}

// Moduł wysokiego poziomu zależny od abstrakcji
class UserService {
    private let repository: UserRepositoryProtocol // Zależność od abstrakcji

    init(repository: UserRepositoryProtocol) {
        self.repository = repository // Wstrzyknięcie zależności
    }

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

// Konfiguracja zależności (lepiej w kontenerze DI)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)

Tutaj, UserService (moduł wysokiego poziomu) nie zależy bezpośrednio od ConcreteUserRepository (moduł niskiego poziomu), lecz od abstrakcji UserRepositoryProtocol. ConcreteUserRepository również zależy od abstrakcji, ją implementując. Zależność "odwraca się" — zamiast, aby moduł wysokiego poziomu zależał od niskiego, oba zależą od abstrakcji.