Sobes.tech
Middle

Bağımlılıkların tersine çevrilmesi ile bağımlılık enjeksiyonu arasındaki fark nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Bağımlılık Ters Çevirme (Dependency Inversion Principle), SOLID ilkelerinden biridir ve şu şekilde der:

  1. Üst düzey modüller, alt düzey modüllere bağlı olmamalıdır. Her ikisi de soyutlamalara bağlı olmalıdır.
  2. Soyutlamalar, detaylara bağlı olmamalıdır; detaylar, soyutlamalara bağlı olmalıdır.

Bağımlılık Enjeksiyonu (Dependency Injection, DI), bir tasarım desenidir ve bağımlılık ters çevirmenin uygulanmasının bir yoludur. Bu, bağımlılıkların (bir sınıfın bağımlı olduğu nesneler) dışarıdan geçirilmesini, sınıfın bunları kendisinin oluşturması yerine sağlar.

Ana farklar:

  • DIC - tasarım ilkesi, DI - tasarım deseni.
  • DIC - yüksek ve düşük seviyeli modüller arasındaki ilişkilerin nasıl olması gerektiğini tanımlar (soyutlamalara bağımlılık).
  • DI - bu ilişkileri uygulamaya koyan yöntemdir. Nesneye bağımlılıkları sağlamak için kullanılan somut bir tekniktir.

Bağımlılık enjeksiyonu örnekleri:

  • Yapıcı Enjeksiyonu: Bağımlılıklar yapıcı aracılığıyla geçirilir.

    // Swift
    class UserFetcher {
        private let apiService: APIServiceProtocol // Soyutlamadan bağımlılık
    
        init(apiService: APIServiceProtocol) { // Yapıcı aracılığıyla enjeksiyon
            self.apiService = apiService
        }
    
        func fetchUsers() {
            // apiService kullanımı
        }
    }
    
    protocol APIServiceProtocol {
        // ...
    }
    
  • Özellik Enjeksiyonu: Bağımlılıklar, public özellikler aracılığıyla ayarlanır (genellikle @IBOutlet kullanılır veya bağımlılık opsiyonel ise).

    // Swift
    class UserController: UIViewController {
        var userFetcher: UserFetcherProtocol? // Dışarıdan ayarlanabilen bağımlılık
    
        override func viewDidLoad() {
            super.viewDidLoad()
            userFetcher?.fetchUsers()
        }
    }
    
    protocol UserFetcherProtocol {
        func fetchUsers()
    }
    
  • Yöntem Enjeksiyonu: Bağımlılıklar, yöntem parametreleri olarak geçirilir.

    // Swift
    class DataProcessor {
        func process(data: Data, using parser: DataParserProtocol) { // Yönteme bağımlılık geçirilir
            parser.parse(data)
        }
    }
    
    protocol DataParserProtocol {
        func parse(_ data: Data)
    }
    

Bu şekilde, bağımlılıkların ters çevrilmesi (düşük bağlılık ve soyutlamalar aracılığıyla) hedeflenir ve bağımlılık enjeksiyonu, bu hedefe ulaşmanın bir yoludur.