Sobes.tech
Middle

Aký je rozdiel medzi inverziou závislostí a injekciou závislostí?

sobes.tech AI

Odpoveď od AI

Inverzia závislosti (Princip závislosti Inversion) je jeden z princípov SOLID, ktorý hovorí:

  1. Moduly vyššej úrovne by nemali závisieť od modulov nižšej úrovne. Oba by mali závisieť od abstrakcií.
  2. Abstrakcie by nemali závisieť od detailov, detaily by mali závisieť od abstrakcií.

Vkladanie závislosti (Dependency Injection, DI) je návrhový vzor, jeden zo spôsobov realizácie inverzie závislosti. Predpokladá odovzdanie závislostí (objektov, od ktorých závisí daná trieda) zvonku, namiesto toho, aby ich trieda vytvárala sama.

Hlavné rozdiely:

  • DIC - princíp návrhu, DI - návrhový vzor.
  • DIC - určuje, aké majú byť vzťahy medzi vysokou a nízkou úrovňou modulov (závislosť od abstrakcií).
  • DI - metóda, ktorá umožňuje realizovať tieto vzťahy. Je to konkrétna technika na dodanie závislostí objektu.

Príklady zavedenia závislosti:

  • Constructor Injection: Závislosti sa odovzdávajú cez konštruktor.

    class UserFetcher {
        private let apiService: APIServiceProtocol // Závislosť od abstrakcie
    
        init(apiService: APIServiceProtocol) { // Zavedenie cez konštruktor
            self.apiService = apiService
        }
    
        func fetchUsers() {
            // použitie apiService
        }
    }
    
    protocol APIServiceProtocol {
        // ...
    }
    
  • Property Injection: Závislosti sa nastavujú cez verejné vlastnosti (často s použitím @IBOutlet alebo ak je potrebná voliteľná závislosť).

    class UserController: UIViewController {
        var userFetcher: UserFetcherProtocol? // Závislosť môže byť nastavená zvonku
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userFetcher?.fetchUsers()
        }
    }
    
    protocol UserFetcherProtocol {
        func fetchUsers()
    }
    
  • Method Injection: Závislosti sa odovzdávajú ako parametre metód.

    class DataProcessor {
        func process(data: Data, using parser: DataParserProtocol) { // Závislosť sa odovzdáva ako parameter
            parser.parse(data)
        }
    }
    
    protocol DataParserProtocol {
        func parse(_ data: Data)
    }
    

Takže, inverzia závislosti — je cieľ (zníženie耦合度 cez abstrakcie), a zavedenie závislosti — je prostriedok (jeden zo spôsobov dosiahnutia tohto cieľa).