Sobes.tech
Middle

Jaka jest różnica między odwróceniem zależności a wstrzykiwaniem zależności?

sobes.tech AI

Odpowiedź od AI

Odwrócenie zależności (zasada odwracania zależności) jest jednym z zasad SOLID, które mówią:

  1. Moduły wyższego poziomu nie powinny zależeć od modułów niższego poziomu. Oba powinny zależeć od abstrakcji.
  2. Abstrakcje nie powinny zależeć od szczegółów, szczegóły powinny zależeć od abstrakcji.

Wstrzykiwanie zależności (Dependency Injection, DI) jest wzorcem projektowym, jednym ze sposobów implementacji odwracania zależności. Polega na przekazywaniu zależności (obiektów, od których zależy dana klasa) z zewnątrz, zamiast aby klasa je tworzyła sama.

Główne różnice:

  • DIC - zasada projektowania, DI - wzorzec projektowy.
  • DIC - określa, jak powinny wyglądać relacje między modułami wysokiego i niskiego poziomu (zależność od abstrakcji).
  • DI - metoda, która pozwala zrealizować te relacje. To konkretna technika dostarczania zależności obiektowi.

Przykłady wstrzykiwania zależności:

  • Wstrzykiwanie przez konstruktor: Zależności są przekazywane przez konstruktor.

    // Swift
    class UserFetcher {
        private let apiService: APIServiceProtocol // Zależność od abstrakcji
    
        init(apiService: APIServiceProtocol) { // Wstrzykiwanie przez konstruktor
            self.apiService = apiService
        }
    
        func fetchUsers() {
            // użycie apiService
        }
    }
    
    protocol APIServiceProtocol {
        // ...
    }
    
  • Wstrzykiwanie przez właściwość: Zależności są ustawiane przez publiczne właściwości (często z użyciem @IBOutlet lub gdy zależność jest opcjonalna).

    // Swift
    class UserController: UIViewController {
        var userFetcher: UserFetcherProtocol? // Zależność, którą można ustawić z zewnątrz
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userFetcher?.fetchUsers()
        }
    }
    
    protocol UserFetcherProtocol {
        func fetchUsers()
    }
    
  • Wstrzykiwanie przez metodę: Zależności są przekazywane jako parametry metod.

    // Swift
    class DataProcessor {
        func process(data: Data, using parser: DataParserProtocol) { // Zależność przekazywana do metody
            parser.parse(data)
        }
    }
    
    protocol DataParserProtocol {
        func parse(_ data: Data)
    }
    

W ten sposób odwrócenie zależności jest celem (zmniejszenie sprzężenia przez abstrakcje), a wstrzykiwanie zależności jest środkiem (jednym ze sposobów osiągnięcia tego celu).