Sobes.tech
Middle

Ποια είναι η διαφορά μεταξύ ανατροπής εξαρτήσεων και εισαγωγής εξαρτήσεων;

sobes.tech AI

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

Η Αρχή Αντιστροφής Εξαρτήσεων (Dependency Inversion Principle) είναι μία από τις αρχές SOLID, που δηλώνει:

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

Η Εισαγωγή Εξαρτήσεων (Dependency Injection, DI) είναι ένα μοτίβο σχεδίασης, ένας από τους τρόπους υλοποίησης της αντίστροφης εξάρτησης. Περιλαμβάνει τη μεταβίβαση των εξαρτήσεων (αντικείμενα από τα οποία εξαρτάται μια κλάση) από έξω, αντί η κλάση να τα δημιουργεί μόνη της.

Βασικές διαφορές:

  • DIC - αρχή σχεδίασης, DI - μοτίβο σχεδίασης.
  • DIC - ορίζει πώς πρέπει να είναι οι σχέσεις μεταξύ των modules υψηλού και χαμηλού επιπέδου (εξάρτηση από αφαιρέσεις).
  • DI - μέθοδος που επιτρέπει την υλοποίηση αυτών των σχέσεων. Είναι μια συγκεκριμένη τεχνική για την παροχή εξαρτήσεων σε ένα αντικείμενο.

Παραδείγματα εισαγωγής εξαρτήσεων:

  • Εισαγωγή μέσω κατασκευαστή: Οι εξαρτήσεις μεταβιβάζονται μέσω του κατασκευαστή.

    // Swift
    class UserFetcher {
        private let apiService: APIServiceProtocol // Εξάρτηση από αφαιρέσεις
    
        init(apiService: APIServiceProtocol) { // Εισαγωγή μέσω κατασκευαστή
            self.apiService = apiService
        }
    
        func fetchUsers() {
            // χρήση του apiService
        }
    }
    
    protocol APIServiceProtocol {
        // ...
    }
    
  • Εισαγωγή μέσω ιδιότητας: Οι εξαρτήσεις ορίζονται μέσω δημόσιων ιδιοτήτων (συχνά με @IBOutlet ή όταν η εξάρτηση είναι προαιρετική).

    // Swift
    class UserController: UIViewController {
        var userFetcher: UserFetcherProtocol? // Εξάρτηση που μπορεί να οριστεί από έξω
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userFetcher?.fetchUsers()
        }
    }
    
    protocol UserFetcherProtocol {
        func fetchUsers()
    }
    
  • Εισαγωγή μέσω μεθόδου: Οι εξαρτήσεις μεταβιβάζονται ως παράμετροι μεθόδων.

    // Swift
    class DataProcessor {
        func process(data: Data, using parser: DataParserProtocol) { // Εξάρτηση που περνάει στη μέθοδο
            parser.parse(data)
        }
    }
    
    protocol DataParserProtocol {
        func parse(_ data: Data)
    }
    

Έτσι, η αντίστροφη εξάρτηση είναι ο στόχος (μείωση του συσχετισμού μέσω αφαιρέσεων), και η εισαγωγή εξαρτήσεων είναι το μέσο (ένας από τους τρόπους επίτευξης αυτού του στόχου).