Mi a különbség a függőségfordítás és a függőségbefecskendezés között?
sobes.tech MI
Válasz az MI-től
A függőség fordított irányítása (Dependency Inversion Principle) a SOLID egyik alapelve, amely kimondja:
- A magas szintű moduloknak nem szabad az alacsony szintű moduloktól függniük. Mindkettőnek az absztrakcióktól kell függnie.
- Az absztrakciók nem szabad, hogy a részletektől függjenek, a részleteknek az absztrakcióktól kell függniük.
A függőség injektálás (Dependency Injection, DI) egy tervezési minta, az egyik módja annak, hogy megvalósítsuk a függőség fordított irányítását. Ez magában foglalja a függőségek (azok az objektumok, amelyekben egy osztály függ) külső átadását, ahelyett, hogy az osztály maga hozná létre azokat.
Fő különbségek:
- DIC - tervezési elv, DI - tervezési minta.
- DIC - meghatározza, hogy a magas és alacsony szintű modulok közötti kapcsolatoknak milyennek kell lenniük (absztrakciókra való függés).
- DI - módszer, amely lehetővé teszi ezeket a kapcsolatokat. Konkrét technika a függőségek objektumnak való biztosítására.
Példák a függőségek injektálására:
-
Konstruktor injektálás: A függőségek a konstruktoron keresztül kerülnek átadásra.
// Swift class UserFetcher { private let apiService: APIServiceProtocol // Absztrakciótól való függőség init(apiService: APIServiceProtocol) { // Injektálás a konstruktoron keresztül self.apiService = apiService } func fetchUsers() { // az apiService használata } } protocol APIServiceProtocol { // ... } -
Tulajdonság injektálás: A függőségek nyilvános tulajdonságokon keresztül kerülnek beállításra (gyakran
@IBOutlethasználatával vagy ha a függőség opcionális).// Swift class UserController: UIViewController { var userFetcher: UserFetcherProtocol? // Olyan függőség, amit kívülről lehet beállítani override func viewDidLoad() { super.viewDidLoad() userFetcher?.fetchUsers() } } protocol UserFetcherProtocol { func fetchUsers() } -
Módszer injektálás: A függőségek módszerek paramétereiként kerülnek átadásra.
// Swift class DataProcessor { func process(data: Data, using parser: DataParserProtocol) { // A függőség a metódusnak átadva parser.parse(data) } } protocol DataParserProtocol { func parse(_ data: Data) }
Így a függőség fordított irányítása a cél (a kapcsolódás csökkentése absztrakciók révén), és a függőség injektálás a módja ennek elérésének (az egyik módja ennek a célnak).