Тәуелділіктерді кері айналдыру мен тәуелділіктерді енгізу арасындағы айырмашылық неде?
sobes.tech AI
AIден жооп
Тескери көз караш (Dependency Inversion Principle) — бул SOLID принциптеринин бири, ал мындай дейт:
- Жогорку деңгээлдеги модулдар төмөнкү деңгээлдеги модулдарга көз каранды болбошу керек. Экиси да абстракциялардан көз каранды болушу керек.
- Абстракциялар деталдардан көз каранды болбошу керек, деталдар абстракциялардан көз каранды болушу керек.
Көз караштын киргизилиши (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) }
Ошентип, көз карашты өзгөртүү — максат (абстракциялар аркылуу耦合ду азайтуу), ал эми көз карашты киргизүү — ал максатка жетүүнүн каражаты (бир нече ыкма).