Swift Academy · Pelajaran

Mengapa Suntikan Kebergantungan

Pisahkan pembinaan daripada penggunaan untuk memudahkan pengujian.

Pelajaran 1 daripada 413 langkah

Mengapa Suntikan Kebergantungan ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Swift Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Mengapa Suntikan Kebergantungan

Suntikan kebergantungan (DI) bermaksud memberikan objek perkara yang diperlukannya dari luar, bukannya membiarkannya mencipta perkara itu sendiri. Ini mengurangkan gandingan antara komponen dan memudahkan ujian.

Masalahnya: Gandingan Ketat

Apabila sesuatu jenis membina komponen sokongannya sendiri, jenis itu terikat pada kelas konkrit tersebut dan tidak boleh dikonfigurasikan semula atau diuji secara berasingan.

class Logger {
    func log(_ m: String) { print("LOG: \(m)") }
}
class Service {
    let logger = Logger() // hard-coded dependency
    func run() { logger.log("running") }
}
Service().run()

Gandingan Menyukarkan Ujian

Oleh sebab Service sentiasa mencipta Logger sebenar, ujian tidak dapat menangkap atau memalsukan hasil log. Kebergantungan itu tidak kelihatan 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: Suntikkannya

Sebaliknya, hantarkan kebergantungan itu dari luar. Pemanggil menentukan pelaksanaan yang hendak diberikan, jadi Service tidak perlu mengambil tahu.

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()

Faedah Penyahgandingan

Dengan suntikan, Service yang sama boleh berfungsi dengan pencatat log yang berbeza, dalam persekitaran sebenar atau ujian, tanpa mengubah kodnya.

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)

Tanggungjawab Tunggal

DI menyokong prinsip tanggungjawab tunggal: sesuatu jenis menumpukan perhatian pada tugasnya dan menyerahkan urusan lain kepada komponen sokongan yang disuntik.

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")

Fleksibiliti

Anda boleh menggabungkan semula objek dengan cara baharu. Penyambungan berlaku di pinggir aplikasi, lalu memastikan terasnya kekal 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()

Kebergantungan yang Jelas

Pemula yang menyenaraikan kebergantungannya mendokumenkan dengan tepat perkara yang diperlukan oleh jenis tersebut. Kebergantungan tersembunyi yang dicipta sendiri menyembunyikan 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())

Penggabungan Berbanding Pembinaan

DI mengutamakan penggabungan objek dari luar. Akar penggabungan yang kecil memasang keseluruhan graf; kod yang lain hanya menerima perkara yang diperlukannya.

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 untuk Aplikasi Besar Sahaja

Program kecil juga mendapat manfaat: menyuntik kebergantungan menjadikan tingkah laku boleh ditukar dan tujuan kod lebih jelas tanpa rangka 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 Memerlukan Rangka Kerja

DI dalam Swift tidak memerlukan pustaka. Pemula biasa dan protokol sudah mencukupi. Pelajaran seterusnya menunjukkan suntikan melalui pembina, protokol dan objek palsu.

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()

Semakan Pantas

Apakah gagasan utama suntikan kebergantungan?

Rumusan

Suntikan kebergantungan membekalkan komponen sokongan dari luar dan bukannya membinanya secara dalaman, sekali gus mengurangkan gandingan, menjelaskan kebergantungan dan membolehkan ujian. Dalam Swift, suntikan ini tidak memerlukan rangka kerja. Seterusnya anda akan melihat bentuk yang paling biasa: suntikan melalui pembina.

Percuma untuk bermula

Pelajari Swift dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
122
Pelajaran
409

Soalan Lazim

Adakah pelajaran “Mengapa Suntikan Kebergantungan” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “Mengapa Suntikan Kebergantungan”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Mengapa Suntikan Kebergantungan”?

Pisahkan pembinaan daripada penggunaan untuk memudahkan pengujian. Anda berlatih Swift Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Swift Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Swift Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.

Berapa lamakah pelajaran “Mengapa Suntikan Kebergantungan” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Swift Academy ini?

Ya. Setiap pelajaran Swift Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengapa Suntikan Kebergantungan
  2. Suntikan Pembina
  3. Abstraksi Berasaskan Protokol
  4. Meniru Kebergantungan dalam Ujian
← Kembali ke Swift Academy