Sobes.tech
Middle

Тәуелділіктерді кері айналдыру мен тәуелділіктерді енгізу арасындағы айырмашылық неде?

sobes.tech AI

AIден жооп

Тескери көз караш (Dependency Inversion Principle) — бул 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)
    }
    

Ошентип, көз карашты өзгөртүү — максат (абстракциялар аркылуу耦合ду азайтуу), ал эми көз карашты киргизүү — ал максатка жетүүнүн каражаты (бир нече ыкма).