İçeriğe geç

Dependency Injection nedir ?

Merhabalar bu yazımda Yazılım dünyasında kullanılan ve bilinmesi gereken yararlı prensiplerden Dependency Injection hakkında bilgi vererek, Swift ile örnek bir kod yazacağım.

Gittikçe büyüyen projeler ve bununla doğru orantıda dikkat edilmediğinde spagetti halini alan okunması ve değiştirilmesi güç kodlar. Bir yazılımcının karşılaşmak istemeyeceği en kötü durumlardan biridir 🙂

Bilgisayar ve yazılım dünyası ortaya çıktığından beri yazılımcılar yaşadıkları sorunları çözüme kavuşturmak adına farklı yazılımsal tasarım kalıplarını ve prensipleri ortaya çıkarmışlardır. Bu prensiplerden en bilindiklerinden olan Dependency Injection yani Dependency (bağımlılık ilgili sınıfa,protokole) Injection ‘da (sınıfları kendi sınıfımıza ekleyerek kullanmak enjekte etmek) anlamı taşımaktadır. Bu yapı programlama dili farketmeksizin tüm nesne yönelimli dillerde modellenebilir.

Bu yapıyı iyi hoş öğreneceğiz sonra kullanacağız’da ne işimize yarayacak ? sorusunu siz sormadan cevaplayacak olursam;

Bu yapıyı kullandığınız zaman projedeki yazdığımız sınıfları bir birinden ayırarak, daha okunaklı ve sonradan düzenlemesi, eklenmesi, geliştirilmesi kolay yapılar elde etmiş oluruz. Sınıfların bir birinden ayırarak gevşek bağlı (loosely coupled) bir yapıya kavuşturmak bu işin en önemli noktalarından biridir. Diğer bir neden ise unit testleri yazarken bu gevşek bağlı olma durumu tüm sınıfları ayrı ayrı test yazarak daha kaliteli ve okunaklı testler yazmamızı sağlamaktadır.

Bu prensipde kendi içerisinde üç farklı kod yapısına ayrılmakta. Bunlar “initalizer,property,method” injection. İsimlerindende anlaşılacağı gibi inject edilecek yapıyı hangi yöntemle kullanacağınızı belirler. Bu işlemleri kendi projenizde kod yapınıza göre şekillendirebilirsiniz.

Aşağıdaki yazdığım örnekte basit olarak initalizer injection işlemini görebilirsiniz.

import Foundation

protocol Serializer {
    func fetchData() -> Data?
}

class Cache: Serializer {
    func fetchData() -> Data? {
        print("fetch cache data...")
        return nil
    }
}

class SQL: Serializer {
    func fetchData() -> Data? {
        print("fetch sql data...")
        return nil
    }
}

class DataManager {
    private var serializer: Serializer
    
    init(_ serializer: Serializer) {
        self.serializer = serializer
    }
}

let cacheObj = Cache()
let dataMObj = DataManager(cacheObj)

 

 

 

Kategori:Design Principles

Bu yazı yorumlara kapalı.

Copyright © 2022 Kenan Atmaca