Sobes.tech
Middle

Asılılıqların çevrilməsi ilə asılılıqların inyeksiyası arasındakı fərq nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Asılılığın Tərs Çevrilməsi (Dependency Inversion Principle) SOLID prinsiplerinden biridir və deyir:

  1. Yuxarı səviyyəli modullar aşağı səviyyəli modullardan asılı olmamalıdır. Hər ikisi abstraksiyalara asılı olmalıdır.
  2. Abstraksiyalar detallardan asılı olmamalıdır, detallər abstraksiyalara asılı olmalıdır.

Asılılıq İnjeksiyası (Dependency Injection, DI) bir dizayn nümunəsidir, bu asılılığın tərs çevrilməsinin ** həyata keçirilməsinin ** bir yoludur. Bu, asılılıqları (bir sinfə bağlı olan obyektlər) xaricdən ötürməyi, sinfin onları özünün yaratmaması ilə təmin edir.

Əsas fərqlər:

  • DIC - dizayn prinsipi, DI - dizayn nümunəsi.
  • DIC - yüksək və aşağı səviyyəli modullar arasındakı münasibətlərin necə olmalı olduğunu müəyyən edir (abstraksiyalara asılılıq).
  • DI - bu münasibətləri həyata keçirmək üçün istifadə olunan metod. Bu, obyektə asılılıqları təmin etmək üçün konkret texnikadır.

Asılılıq İnjeksiyasının nümunələri:

  • Konstruktor vasitəsilə İnjeksiyası: Asılılıqlar konstruktor vasitəsilə ötürülür.

    // Swift
    class UserFetcher {
        private let apiService: APIServiceProtocol // Abstraksiyadan asılılıq
    
        init(apiService: APIServiceProtocol) { // Konstruktor vasitəsilə İnjeksiyası
            self.apiService = apiService
        }
    
        func fetchUsers() {
            // apiService-dən istifadə
        }
    }
    
    protocol APIServiceProtocol {
        // ...
    }
    
  • Xüsusiyyət vasitəsilə İnjeksiyası: Asılılıqlar ictimai xüsusiyyətlər vasitəsilə qurulur (tez-tez @IBOutlet istifadə edilir və ya asılılıq opsionaldır).

    // Swift
    class UserController: UIViewController {
        var userFetcher: UserFetcherProtocol? // Xaricdən qurula bilən asılılıq
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userFetcher?.fetchUsers()
        }
    }
    
    protocol UserFetcherProtocol {
        func fetchUsers()
    }
    
  • Yöntəm vasitəsilə İnjeksiyası: Asılılıqlar metodların parametrləri kimi ötürülür.

    // Swift
    class DataProcessor {
        func process(data: Data, using parser: DataParserProtocol) { // Yöntəmə asılılığı ötürülür
            parser.parse(data)
        }
    }
    
    protocol DataParserProtocol {
        func parse(_ data: Data)
    }
    

Bu şəkildə, asılılığın tərs çevrilməsi (abstraksiyalar vasitəsilə əlaqənin azaldılması) məqsədidir və asılılıq injeksiyası bu məqsədə çatmaq üçün vasitədir (bu məqsədə çatmanın bir yoludur).