Sobes.tech
Middle

Jaký je rozdíl mezi inverzí závislostí a injekcí závislostí?

sobes.tech AI

Odpověď od AI

Princip inverze závislostí (Dependency Inversion Principle) je jedním z principů SOLID, který říká:

  1. Moduly vyšší úrovně by neměly záviset na modulech nižší úrovně. Oba by měly záviset na abstrakcích.
  2. Abstrakce by neměly záviset na detailech, detaily by měly záviset na abstrakcích.

Vstřikování závislostí (Dependency Injection, DI) je návrhový vzor, jeden ze způsobů, jak implementovat inverzi závislostí. Předpokládá předání závislostí (objektů, na kterých závisí třída) zvenčí, místo toho, aby je třída vytvářela sama.

Hlavní rozdíly:

  • DIC - princip návrhu, DI - návrhový vzor.
  • DIC - určuje, jak by měly být vztahy mezi moduly vysoké a nízké úrovně (závislost na abstrakcích).
  • DI - metoda, která umožňuje tyto vztahy realizovat. Je to konkrétní technika pro dodávání závislostí objektu.

Příklady vstřikování závislostí:

  • Vstřikování přes konstruktor: Závislosti jsou předávány přes konstruktor.

    // Swift
    class UserFetcher {
        private let apiService: APIServiceProtocol // Závislost na abstrakci
    
        init(apiService: APIServiceProtocol) { // Vstřikování přes konstruktor
            self.apiService = apiService
        }
    
        func fetchUsers() {
            // použití apiService
        }
    }
    
    protocol APIServiceProtocol {
        // ...
    }
    
  • Vstřikování přes vlastnost: Závislosti jsou nastavovány přes veřejné vlastnosti (často s použitím @IBOutlet nebo pokud je závislost volitelná).

    // Swift
    class UserController: UIViewController {
        var userFetcher: UserFetcherProtocol? // Závislost, která může být nastavena zvenčí
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userFetcher?.fetchUsers()
        }
    }
    
    protocol UserFetcherProtocol {
        func fetchUsers()
    }
    
  • Vstřikování přes metodu: Závislosti jsou předávány jako parametry metod.

    // Swift
    class DataProcessor {
        func process(data: Data, using parser: DataParserProtocol) { // Závislost předána metodě
            parser.parse(data)
        }
    }
    
    protocol DataParserProtocol {
        func parse(_ data: Data)
    }
    

Tímto způsobem je inverze závislostí cílem (snížení vazby přes abstrakce), a vstřikování závislostí je prostředek (jeden ze způsobů, jak tohoto cíle dosáhnout).