Sobes.tech
Middle

Koja je razlika između inverzije zavisnosti i injekcije zavisnosti?

sobes.tech АИ

Одговор од АИ

Инверзија зависности (Принцип инверзије зависности) је један од принципа SOLID који гласи:

  1. Модули високог нивоа не треба да зависе од модула ниског нивоа. Обоје треба да зависе од апстракција.
  2. Апстракције не треба да зависе од детаља, детаљи треба да зависе од апстракција.

Уметање зависности (Dependency Injection, DI) је образац дизајна, један од начина реализације инверзије зависности. Он подразумева пренос зависности (објеката од којих зависи ова класа) споља, уместо да их класа сама креира.

Основне разлике:

  • DIC - принцип дизајна, DI - образац дизајна.
  • DIC - одређује како треба да изгледају односи између високог и ниског нивоа модула (зависност од апстракција).
  • DI - метод који омогућава реализовање ових односа. То је конкретна техника за испоруку зависности објекту.

Примери уметања зависности:

  • Constructor Injection: Зависности се преносе кроз конструктор.

    class UserFetcher {
        private let apiService: APIServiceProtocol // Зависност од апстракције
    
        init(apiService: APIServiceProtocol) { // Уметање кроз конструктор
            self.apiService = apiService
        }
    
        func fetchUsers() {
            // коришћење apiService
        }
    }
    
    protocol APIServiceProtocol {
        // ...
    }
    
  • Property Injection: Зависности се постављају кроз јавне својства (често уз коришћење @IBOutlet или ако је потребна опциони зависност).

    class UserController: UIViewController {
        var userFetcher: UserFetcherProtocol? // Зависност може бити постављена споља
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userFetcher?.fetchUsers()
        }
    }
    
    protocol UserFetcherProtocol {
        func fetchUsers()
    }
    
  • Method Injection: Зависности се преносе као параметри метода.

    class DataProcessor {
        func process(data: Data, using parser: DataParserProtocol) { // Зависност се преноси као параметар
            parser.parse(data)
        }
    }
    
    protocol DataParserProtocol {
        func parse(_ data: Data)
    }
    

Дакле, инверзија зависности — то је циљ (смањење耦合度 кроз апстракције), а уметање зависности — то је средство (један од начина постизања тог циља).