Mengapa Injeksi Dependensi
Pisahkan pembuatan dari penggunaan agar mudah diuji.
Mengapa Injeksi Dependensi adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Swift Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Swift Academy mencakup 4 pelajaran total.
Mengapa Injeksi Dependensi
Injeksi dependensi (DI) berarti memberikan objek hal-hal yang dibutuhkannya dari luar, alih-alih membiarkan objek tersebut membuatnya sendiri. Hal ini mengurangi keterikatan antarkomponen dan membuatnya lebih mudah diuji.
Masalahnya: Keterikatan Erat
Ketika suatu tipe membuat objek pendukungnya sendiri, tipe tersebut terikat pada kelas konkret itu dan tidak dapat dikonfigurasi ulang atau diuji secara terpisah.
class Logger {
func log(_ m: String) { print("LOG: \(m)") }
}
class Service {
let logger = Logger() // hard-coded dependency
func run() { logger.log("running") }
}
Service().run()Keterikatan Menyulitkan Pengujian
Karena Service selalu membuat Logger nyata, pengujian tidak dapat menangkap atau memalsukan keluaran pencatatan. Dependensi tersebut tidak terlihat dari luar.
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()Gagasannya: Injeksi
Sebagai gantinya, teruskan dependensi tersebut. Pemanggil menentukan implementasi yang akan diberikan, sehingga Service tidak lagi perlu mengetahuinya.
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()Manfaat Mengurangi Keterikatan
Dengan injeksi, Service yang sama dapat bekerja dengan logger yang berbeda, baik dalam produksi maupun pengujian, tanpa mengubah kodenya.
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)Tanggung Jawab Tunggal
DI mendukung prinsip tanggung jawab tunggal: suatu tipe berfokus pada tugasnya dan menyerahkan urusan lain kepada objek pendukung yang diinjeksi.
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")Fleksibilitas
Anda dapat menyusun kembali objek dengan cara-cara baru. Perakitan berlangsung di bagian tepi app, sehingga inti aplikasi tetap fleksibel.
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()Dependensi Eksplisit
Penginisialisasi yang mencantumkan dependensinya mendokumentasikan secara tepat hal-hal yang dibutuhkan tipe tersebut. Dependensi tersembunyi yang dibuat sendiri menyamarkan kontrak itu.
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())Komposisi, Bukan Konstruksi
DI mengutamakan penyusunan objek dari luar. Akar komposisi kecil merakit graf tersebut; kode lainnya cukup menerima hal-hal yang dibutuhkannya.
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()Bukan Hanya untuk Aplikasi Besar
Bahkan program kecil pun memperoleh manfaat: menginjeksi dependensi membuat perilaku dapat ditukar dan maksud kode menjadi jelas tanpa kerangka kerja tambahan.
struct Clock { func now() -> Int { 12 } }
struct Greeter {
let clock: Clock
func greet() { print(clock.now() < 12 ? "Morning" : "Afternoon") }
}
Greeter(clock: Clock()).greet()Tidak Perlu Kerangka Kerja
DI Swift tidak memerlukan pustaka. Penginisialisasi sederhana dan protokol sudah cukup. Pelajaran berikutnya menunjukkan injeksi konstruktor, protokol, dan pembuatan tiruan.
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()Pemeriksaan Singkat
Apa gagasan utama injeksi dependensi?
Rangkuman
Injeksi dependensi menyediakan objek pendukung dari luar, bukan membuatnya secara internal. Cara ini mengurangi keterikatan, memperjelas dependensi, dan memungkinkan pengujian. DI di Swift tidak memerlukan kerangka kerja. Berikutnya Anda akan melihat bentuk yang paling umum: injeksi konstruktor.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengapa Injeksi Dependensi” gratis?
Ya — teks lengkap “Mengapa Injeksi Dependensi” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Swift Academy, upgrade ke CoddyKit PRO. Kursus Swift Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengapa Injeksi Dependensi”?
Pisahkan pembuatan dari penggunaan agar mudah diuji. Kamu berlatih Swift Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Swift Academy?
Tidak diperlukan pengalaman sebelumnya. Swift Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Mengapa Injeksi Dependensi” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Swift Academy ini?
Ya. Setiap pelajaran Swift Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Mengapa Injeksi Dependensi
- Injeksi Konstruktor
- Abstraksi Berbasis Protocol
- Membuat Mock Dependensi dalam Pengujian