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í:
- Moduly vyššej úrovne by nemali závisieť od modulov nižšej úrovne. Oba by mali závisieť od abstrakcií.
- 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
@IBOutletalebo 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).