Bağımlılık Enjeksiyonu Neden Kullanılır
Sınanabilirlik için oluşturmayı kullanımdan ayırın.
Bağımlılık Enjeksiyonu Neden Kullanılır, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.
Bağımlılık Enjeksiyonu Neden Kullanılır
Bağımlılık enjeksiyonu (DI), bir nesnenin ihtiyaç duyduğu şeyleri kendisinin oluşturması yerine dışarıdan almasıdır. Bu yaklaşım bileşenlerin birbirine bağımlılığını azaltır ve onları sınamayı kolaylaştırır.
Sorun: Sıkı Bağlılık
Bir tür kendi işbirlikçi nesnelerini oluşturduğunda, somut sınıflara bağlı kalır ve yeniden yapılandırılamaz veya yalıtılmış olarak sınanamaz.
class Logger {
func log(_ m: String) { print("LOG: \(m)") }
}
class Service {
let logger = Logger() // hard-coded dependency
func run() { logger.log("running") }
}
Service().run()Bağlılık Sınamayı Zorlaştırır
Service her zaman gerçek bir Logger oluşturduğu için bir sınama, günlük kaydı çıktısını yakalayamaz veya taklit edemez. Bağımlılık dışarıdan görünmez.
class Logger { func log(_ m: String) { print(m) } }
class Service {
let logger = Logger()
func run() { logger.log("hello") }
}
// No way to swap Logger here.
Service().run()Fikir: Bağımlılığı Enjekte Etme
Bunun yerine bağımlılığı dışarıdan geçiriniz. Çağıran taraf hangi uygulamanın sağlanacağına karar verir; böylece Service artık bununla ilgilenmez.
class Logger { func log(_ m: String) { print("LOG: \(m)") } }
class Service {
let logger: Logger
init(logger: Logger) { self.logger = logger }
func run() { logger.log("running") }
}
Service(logger: Logger()).run()Bağları Ayırmanın Faydaları
Enjeksiyon sayesinde aynı Service, kodunu değiştirmeden üretimde veya sınamalarda farklı günlük kaydı bileşenleriyle çalışabilir.
class Logger { var lines: [String] = []
func log(_ m: String) { lines.append(m) } }
class Service {
let logger: Logger
init(logger: Logger) { self.logger = logger }
func run() { logger.log("event") }
}
let l = Logger()
Service(logger: l).run()
print(l.lines)Tek Sorumluluk
DI, tek sorumluluk ilkesini destekler: bir tür kendi görevine odaklanır ve diğer sorumlulukları enjekte edilen işbirlikçilere devreder.
struct Mailer { func send(_ to: String) { print("Mail to \(to)") } }
struct SignupFlow {
let mailer: Mailer
func register(_ email: String) { mailer.send(email) }
}
SignupFlow(mailer: Mailer()).register("a@b.com")Esneklik
Nesneleri yeni şekillerde yeniden birleştirebilirsiniz. Bağlantıların kurulması uygulamanızın sınırlarında gerçekleşir ve çekirdeğin esnek kalmasını sağlar.
struct Engine { let power: Int }
struct Car {
let engine: Engine
func describe() { print("Power: \(engine.power)") }
}
Car(engine: Engine(power: 200)).describe()
Car(engine: Engine(power: 90)).describe()Açık Bağımlılıklar
Bağımlılıkları listeleyen bir başlatıcı, türün tam olarak neye ihtiyaç duyduğunu belgeler. Gizli ve kendi kendine oluşturulan bağımlılıklar bu sözleşmeyi gizler.
struct Repo { func load() -> [Int] { [1, 2, 3] } }
struct Report {
let repo: Repo // visible dependency
func total() -> Int { repo.load().reduce(0, +) }
}
print(Report(repo: Repo()).total())Oluşturmak Yerine Birleştirme
DI, nesnelerin dışarıdan birleştirilmesini tercih eder. Küçük bir birleştirme kökü grafiği oluşturur; kodun geri kalanı yalnızca ihtiyaç duyduğu şeyleri alır.
struct DB { func count() -> Int { 42 } }
struct Stats { let db: DB; func show() { print(db.count()) } }
// Composition root:
let app = Stats(db: DB())
app.show()Yalnızca Büyük Uygulamalar İçin Değil
Küçük programlar bile bundan yararlanır: bir bağımlılığı enjekte etmek, ek çerçeveler olmadan davranışın değiştirilebilmesini ve niyetlerin açık olmasını sağlar.
struct Clock { func now() -> Int { 12 } }
struct Greeter {
let clock: Clock
func greet() { print(clock.now() < 12 ? "Morning" : "Afternoon") }
}
Greeter(clock: Clock()).greet()Çerçeve Gerekmez
Swift'te DI için kütüphane gerekmez. Düz başlatıcılar ve protokoller yeterlidir. Gelecek derslerde kurucu enjeksiyonunu, protokolleri ve taklit nesnelerini göreceksiniz.
struct Adder { func add(_ a: Int, _ b: Int) -> Int { a + b } }
struct Calc {
let adder: Adder
func run() { print(adder.add(2, 3)) }
}
Calc(adder: Adder()).run()Hızlı Denetim
Bağımlılık enjeksiyonunun temel fikri nedir?
Özet
Bağımlılık enjeksiyonu, işbirlikçi nesneleri içeride oluşturmak yerine dışarıdan sağlar; böylece bağlılığı azaltır, bağımlılıkları açık hâle getirir ve sınamayı mümkün kılar. Swift'te bunun için bir çerçeve gerekmez. Sırada en yaygın biçimi göreceksiniz: kurucu enjeksiyonu.
Sıkça Sorulan Sorular
“Bağımlılık Enjeksiyonu Neden Kullanılır” dersi ücretsiz mi?
Evet — “Bağımlılık Enjeksiyonu Neden Kullanılır” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.
“Bağımlılık Enjeksiyonu Neden Kullanılır” dersinde ne öğreneceğim?
Sınanabilirlik için oluşturmayı kullanımdan ayırın. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Swift Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“Bağımlılık Enjeksiyonu Neden Kullanılır” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Bağımlılık Enjeksiyonu Neden Kullanılır
- Kurucu Enjeksiyonu
- Protokol Tabanlı Soyutlamalar
- Sınamalarda Bağımlılıkları Taklit Etme