Sobes.tech
Middle

Kuo skiriasi priklausomybių inversija ir priklausomybių įvedimas?

sobes.tech AI

Atsakymas iš AI

Priklausomybės inversija (Dependency Inversion Principle) yra vienas iš SOLID principų, kuris teigia:

  1. Aukšto lygio moduliai neturi priklausyti nuo žemo lygio modulių. Abu turi priklausyti nuo abstrakcijų.
  2. Abstrakcijos neturi priklausyti nuo detalių, detalės turi priklausyti nuo abstrakcijų.

Priklausomybės įvedimas (Dependency Injection, DI) yra projektavimo šablonas, vienas iš būdų įgyvendinti priklausomybės inversiją. Jis apima priklausomybių (objektų, nuo kurių priklauso ši klasė) perdavimą iš išorės, vietoj to, kad klasė jas pati kuria.

Pagrindiniai skirtumai:

  • DIC - projektavimo principas, DI - projektavimo šablonas.
  • DIC - nustato, kaip turėtų būti santykiai tarp aukšto ir žemo lygio modulių (priklausomybė nuo abstrakcijų).
  • DI - metodas, leidžiantis įgyvendinti šiuos santykius. Tai konkreti technika priklausomybių tiekimui objektui.

Pavyzdžiai priklausomybės įvedimo:

  • Constructor Injection: priklausomybės perduodamos per konstruktorių.

    class UserFetcher {
        private let apiService: APIServiceProtocol // Abstrakcijos priklausomybė
    
        init(apiService: APIServiceProtocol) { // Įvedimas per konstruktorių
            self.apiService = apiService
        }
    
        func fetchUsers() {
            // naudojimas apiService
        }
    }
    
    protocol APIServiceProtocol {
        // ...
    }
    
  • Property Injection: priklausomybės nustatomos per viešas savybes (dažnai naudojant @IBOutlet arba jei reikalinga opcionalinė priklausomybė).

    class UserController: UIViewController {
        var userFetcher: UserFetcherProtocol? // Priklausomybė gali būti nustatyta iš išorės
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userFetcher?.fetchUsers()
        }
    }
    
    protocol UserFetcherProtocol {
        func fetchUsers()
    }
    
  • Method Injection: priklausomybės perduodamos kaip metodų parametrai.

    class DataProcessor {
        func process(data: Data, using parser: DataParserProtocol) { // Priklausomybė perduodama kaip metodas
            parser.parse(data)
        }
    }
    
    protocol DataParserProtocol {
        func parse(_ data: Data)
    }
    

Taigi, priklausomybės inversija — tai tikslas (sumažinti耦合 per abstrakcijas), o priklausomybės įvedimas — tai priemonė (vienas iš būdų pasiekti šį tikslą).