Sobes.tech
Middle

Μίλησε για την αρχή των εξαρτήσεων στο SOLID, που αντιστοιχεί στο γράμμα D.

sobes.tech AI

Απάντηση από AI

Αρχή Αντιστροφής Εξαρτήσεων (Dependency Inversion Principle, DIP).

Τα modules υψηλού επιπέδου δεν πρέπει να εξαρτώνται από τα modules χαμηλού επιπέδου. Και τα δύο πρέπει να εξαρτώνται από αφαιρέσεις. Οι αφαιρέσεις δεν πρέπει να εξαρτώνται από λεπτομέρειες. Οι λεπτομέρειες πρέπει να εξαρτώνται από αφαιρέσεις.

Ο στόχος της αρχής: μείωση του δεσμού μεταξύ των συστατικών, καθιστώντας το σύστημα πιο ευέλικτο, δοκιμαστικό και κλιμακούμενο.

Παράδειγμα σε Swift:

Κακό:

class UserRepository {
    func getAllUsers() -> [User] {
        // Λογική για λήψη χρηστών από μια συγκεκριμένη βάση δεδομένων ή δίκτυο
        // ...υλοποίηση...
        return []
    }
}

class UserService {
    private let repository = UserRepository() // Άμεση εξάρτηση από μια συγκεκριμένη υλοποίηση

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

Καλό (εφαρμόζοντας DIP):

// Αφαίρεση
protocol UserRepositoryProtocol {
    func getAllUsers() -> [User]
}

// Χαμηλού επιπέδου module (υλοποίηση της αφαιρεσης)
class ConcreteUserRepository: UserRepositoryProtocol {
    func getAllUsers() -> [User] {
        // Λογική για λήψη χρηστών (λεπτομέρειες υλοποίησης)
        // ...υλοποίηση...
        return []
    }
}

// Υψηλού επιπέδου module που εξαρτάται από την αφαιρεση
class UserService {
    private let repository: UserRepositoryProtocol // Εξάρτηση από την αφαιρεση

    init(repository: UserRepositoryProtocol) {
        self.repository = repository // Ενέσιση εξάρτησης
    }

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

// Σύνθεση εξαρτήσεων (καλύτερα σε DI container)
let repository = ConcreteUserRepository()
let userService = UserService(repository: repository)

Εδώ, το UserService (υψηλού επιπέδου module) δεν εξαρτάται άμεσα από το ConcreteUserRepository (χαμηλού επιπέδου module), αλλά εξαρτάται από την αφαιρεση UserRepositoryProtocol. Το ConcreteUserRepository επίσης εξαρτάται από την αφαιρεση και την υλοποιεί. Η εξάρτηση "αντιστρέφεται" — αντί το υψηλού επιπέδου module να εξαρτάται από το χαμηλού επιπέδου, και τα δύο εξαρτώνται από την αφαιρεση.