0Pricing
Swift Academy · Pelajaran

Abstraksi Berbasis Protocol

Bergantunglah pada protocol, bukan tipe konkret.

Abstraksi Berbasis Protocol adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 3 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.

Abstraksi Berbasis Protokol

Menginjeksi protokol, bukan tipe konkret, memungkinkan Anda menukar implementasi dengan bebas. Konsumen hanya bergantung pada perilaku, bukan kelasnya.

Mendefinisikan Protokol

Jelaskan kemampuan tersebut sebagai protokol. Tipe apa pun yang mematuhinya dapat diberikan sebagai dependensi.

protocol Logging {
    func log(_ message: String)
}
print("Protocol describes behavior, not a concrete class.")

Membuat Tipe Konkret Mematuhi Protokol

Implementasi nyata mematuhi protokol tersebut. Implementasi inilah yang menjadi dependensi produksi.

protocol Logging { func log(_ m: String) }
struct ConsoleLogger: Logging {
    func log(_ m: String) { print("LOG: \(m)") }
}
ConsoleLogger().log("ready")

Bergantung pada Protokol

Tipe properti konsumen adalah protokol, sehingga properti tersebut menerima nilai apa pun yang mematuhi protokol.

protocol Logging { func log(_ m: String) }
struct ConsoleLogger: Logging { func log(_ m: String) { print(m) } }
struct Service {
    let logger: Logging // protocol, not ConsoleLogger
    func run() { logger.log("running") }
}
Service(logger: ConsoleLogger()).run()

Menukar Implementasi

Karena tipe tersebut adalah protokol, Anda dapat meneruskan implementasi lain yang mematuhinya tanpa menyentuh konsumen.

protocol Logging { func log(_ m: String) }
struct Loud: Logging { func log(_ m: String) { print(m.uppercased()) } }
struct Quiet: Logging { func log(_ m: String) {} }
struct Service { let logger: Logging; func run() { logger.log("hi") } }
Service(logger: Loud()).run()
Service(logger: Quiet()).run()

Pemrograman terhadap Antarmuka

Ini adalah prinsip “bergantung pada abstraksi, bukan konkret”. Kode tingkat tinggi terlindung dari detail tingkat rendah.

protocol Storage { func save(_ v: Int) }
struct MemoryStore: Storage { func save(_ v: Int) { print("kept \(v)") } }
struct Manager { let store: Storage; func add() { store.save(1) } }
Manager(store: MemoryStore()).add()

Beberapa Tipe yang Mematuhi Protokol

Beberapa tipe dapat mematuhi protokol yang sama, masing-masing sesuai untuk konteks seperti jaringan, disk, atau memori.

protocol Source { func value() -> Int }
struct Fixed: Source { func value() -> Int { 10 } }
struct Doubler: Source { func value() -> Int { 20 } }
func use(_ s: Source) { print(s.value()) }
use(Fixed())
use(Doubler())

Protokol dengan Perilaku Terkait

Protokol dapat mendeklarasikan beberapa metode, sehingga membentuk kontrak yang jelas untuk dependensi.

protocol Cache {
    func get(_ key: String) -> Int?
    func set(_ key: String, _ v: Int)
}
struct Dict: Cache {
    var store: [String: Int] = [:]
    func get(_ k: String) -> Int? { store[k] }
    mutating func set(_ k: String, _ v: Int) { store[k] = v }
}
var c = Dict(); c.set("a", 1)
print(c.get("a") ?? -1)

Batasan Generik

Anda juga dapat menginjeksi melalui parameter generik yang dibatasi oleh protokol, sehingga menghindari beban tambahan eksistensial.

protocol Greeter { func greet() -> String }
struct English: Greeter { func greet() -> String { "Hello" } }
struct Welcome<G: Greeter> {
    let greeter: G
    func show() { print(greeter.greet()) }
}
Welcome(greeter: English()).show()

Kontrak yang Stabil

Selama protokol tetap stabil, implementasi dapat berubah secara internal tanpa merusak konsumen.

protocol Formatter { func format(_ n: Int) -> String }
struct Plain: Formatter { func format(_ n: Int) -> String { "\(n)" } }
struct Padded: Formatter { func format(_ n: Int) -> String { String(format: "%03d", n) } }
func render(_ f: Formatter) { print(f.format(7)) }
render(Plain())
render(Padded())

Menyiapkan Pembuatan Tiruan

Yang terpenting, protokol memungkinkan pengujian menyediakan implementasi tiruan yang mematuhi protokol sebagai pengganti implementasi nyata. Inilah fokus pelajaran berikutnya.

protocol Network { func fetch() -> String }
struct Real: Network { func fetch() -> String { "server data" } }
struct VM { let net: Network; func load() { print(net.fetch()) } }
VM(net: Real()).load()

Pemeriksaan Singkat

Mengapa menginjeksi tipe protokol, bukan kelas konkret?

Rangkuman

Menginjeksi protokol mengabstraksikan tipe konkret, sehingga implementasi apa pun yang mematuhinya dapat digunakan sebagai pengganti. Cara ini mengikuti prinsip “bergantung pada abstraksi” dan memungkinkan implementasi alternatif serta, yang terpenting, tiruan pengujian. Berikutnya: membuat tiruan dependensi dalam pengujian.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Abstraksi Berbasis Protocol” gratis?

Ya — teks lengkap “Abstraksi Berbasis Protocol” 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 “Abstraksi Berbasis Protocol”?

Bergantunglah pada protocol, bukan tipe konkret. 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 3 dari 4.

Berapa lama pelajaran “Abstraksi Berbasis Protocol” 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

  1. Mengapa Injeksi Dependensi
  2. Injeksi Konstruktor
  3. Abstraksi Berbasis Protocol
  4. Membuat Mock Dependensi dalam Pengujian
← Kembali ke Swift Academy