Kurucu Enjeksiyonu
Bağımlılıkları başlatıcılar üzerinden aktarın.
Kurucu Enjeksiyonu, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 2. 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.
Kurucu Enjeksiyonu
DI'nin en yaygın biçimi, bağımlılıkları bir başlatıcı üzerinden geçirir. Nesne, oluşturulurken ihtiyaç duyduğu her şeyi alır ve bunları saklar.
Temel Bir Başlatıcı
Saklanan bir özellik tanımlayınız ve bunu init içinde atayınız. Nesneyi oluşturmak için çağıran taraf bağımlılığı sağlamak zorundadır.
struct Greeter { func hi() -> String { "Hi" } }
struct View {
let greeter: Greeter
init(greeter: Greeter) { self.greeter = greeter }
func show() { print(greeter.hi()) }
}
View(greeter: Greeter()).show()Değişmez Bağımlılıklar
Enjekte edilen özelliklerde let kullanmak onları değişmez hâle getirir; böylece bir bağımlılık oluşturma işleminden sonra değiştirilemez.
struct Engine { let hp: Int }
struct Car {
let engine: Engine // cannot change later
init(engine: Engine) { self.engine = engine }
}
let c = Car(engine: Engine(hp: 150))
print(c.engine.hp)Birden Çok Bağımlılık
Birden fazla işbirlikçi nesne enjekte etmek için birkaç parametre listeleyiniz. Başlatıcı, gereksinimlerin tamamını belgeler.
struct DB { func get() -> Int { 7 } }
struct Cache { func put(_ v: Int) { print("cached \(v)") } }
struct Service {
let db: DB
let cache: Cache
init(db: DB, cache: Cache) { self.db = db; self.cache = cache }
func run() { cache.put(db.get()) }
}
Service(db: DB(), cache: Cache()).run()Varsayılan Parametre Değerleri
Varsayılan bir değer, çağıran tarafların üretimde bir bağımlılığı belirtmemesine izin verirken sınamalarda bu değerin değiştirilmesine de olanak tanır.
struct Logger { func log(_ m: String) { print(m) } }
struct Service {
let logger: Logger
init(logger: Logger = Logger()) { self.logger = logger }
func run() { logger.log("go") }
}
Service().run() // uses defaultSınıf Kurucu Enjeksiyonu
Sınıflar da aynı modeli izler. Başlatıcı, örnek kullanılabilir hâle gelmeden önce her bağımlılığı atar.
class Mailer { func send() { print("sent") } }
class Signup {
let mailer: Mailer
init(mailer: Mailer) { self.mailer = mailer }
func go() { mailer.send() }
}
Signup(mailer: Mailer()).go()Değerleri Enjekte Etme
Bağımlılıkların nesne olması gerekmez. Temel bir URL veya bir bayrak gibi yapılandırma değerlerini de aynı şekilde enjekte edebilirsiniz.
struct Client {
let baseURL: String
init(baseURL: String) { self.baseURL = baseURL }
func endpoint(_ p: String) -> String { baseURL + p }
}
print(Client(baseURL: "https://api").endpoint("/users"))Birleştirme Kökü
Uygulamanın giriş noktasına yakın tek bir yer, nesne grafiğinin tamamını birbirine bağlar. Geri kalan her şey hazır bağımlılıkları alır.
struct DB { func count() -> Int { 3 } }
struct Repo { let db: DB; func n() -> Int { db.count() } }
struct App { let repo: Repo; func run() { print(repo.n()) } }
// Composition root:
let app = App(repo: Repo(db: DB()))
app.run()Gizli Küresel Değişkenlerden Kaçınma
Kurucu enjeksiyonu, gizli küresel erişimin yerini alır. Her bağımlılık açıkça belirtildiği için verilerin nasıl aktığını izleyebilirsiniz.
struct Settings { let theme: String }
struct Screen {
let settings: Settings
func render() { print("Theme: \(settings.theme)") }
}
Screen(settings: Settings(theme: "dark")).render()Gerekli ve İsteğe Bağlı
Bir bağımlılık gerçekten isteğe bağlıysa onu isteğe bağlı bir türle modelleyiniz; aksi takdirde nesnenin eksik yapılandırılmış olarak var olamaması için bu bağımlılığı zorunlu kılınız.
struct Analytics { func track() { print("tracked") } }
struct Flow {
let analytics: Analytics?
func step() { analytics?.track() }
}
Flow(analytics: Analytics()).step()
Flow(analytics: nil).step()Kurucu Enjeksiyonu Neden Kullanılır
Bu yöntem tamamen başlatılmış bir nesneyi garanti eder, bağımlılıkları görünür kılar ve let değişmezliğiyle çalışır. Swift'te önerilen varsayılan yaklaşımdır.
struct Adder { func add(_ a: Int, _ b: Int) -> Int { a + b } }
struct Calc {
let adder: Adder
init(adder: Adder) { self.adder = adder }
}
print(Calc(adder: Adder()).adder.add(4, 5))Hızlı Denetim
Kurucu enjeksiyonu neden çoğu zaman tercih edilir?
Özet
Kurucu enjeksiyonu, bağımlılıkları init üzerinden geçirir ve genellikle bunları değişmez let özellikleri olarak saklar. Nesneleri veya değerleri enjekte edebilir, varsayılanlar sağlayabilir ve her şeyi bir birleştirme kökünde birbirine bağlayabilirsiniz. Sırada somut türler yerine protokolleri enjekte edeceksiniz.
Sıkça Sorulan Sorular
“Kurucu Enjeksiyonu” dersi ücretsiz mi?
Evet — “Kurucu Enjeksiyonu” 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.
“Kurucu Enjeksiyonu” dersinde ne öğreneceğim?
Bağımlılıkları başlatıcılar üzerinden aktarı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 2. dersidir.
“Kurucu Enjeksiyonu” 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