Sobes.tech
Middle

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:

  1. A magas szintű moduloknak nem szabad az alacsony szintű moduloktól függniük. Mindkettőnek az absztrakcióktól kell függnie.
  2. 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 @IBOutlet haszná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).