Pola Use Case dan Repositori
Mendefinisikan use case sebagai protokol Swift dan mengimplementasikan interface repositori.
Pola Use Case dan Repositori adalah pelajaran Swift Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.
Apa Itu Kasus Penggunaan?
Kasus penggunaan (interaktor) merangkum satu tindakan bisnis, dengan mengatur entitas ranah dan repositori.
struct PlaceOrderUseCase {
let cart: CartRepository
let payment: PaymentService
let orders: OrderRepository
func execute(userId: Int) async throws -> Order {
let items = try await cart.items(for: userId)
let receipt = try await payment.charge(items: items)
return try await orders.create(receipt: receipt)
}
}Tanggung Jawab Tunggal
Setiap kasus penggunaan melakukan tepat satu hal. Beberapa tanggung jawab berarti diperlukan beberapa kasus penggunaan.
// One use case per business action:
struct FetchUserUseCase { ... }
struct UpdateUserUseCase { ... }
struct DeleteUserUseCase { ... }Kasus Penggunaan sebagai Protokol
Tentukan protokol untuk kasus penggunaan agar dapat dibuat tiruannya dalam pengujian lapisan Presentasi.
protocol PlacingOrder {
func execute(userId: Int) async throws -> Order
}
struct PlaceOrderUseCase: PlacingOrder { ... }Apa Itu Repositori?
Repositori mengabstraksikan sumber data. Pemanggil berinteraksi dengan protokol Swift; implementasinya dapat menggunakan jaringan, Core Data, atau memori.
protocol OrderRepository {
func create(receipt: PaymentReceipt) async throws -> Order
func list(userId: Int) async throws -> [Order]
func cancel(orderId: Int) async throws
}Implementasi Repositori
Repositori konkret menerjemahkan panggilan ranah menjadi operasi jaringan atau basis data.
struct RemoteOrderRepository: OrderRepository {
func create(receipt: PaymentReceipt) async throws -> Order {
let dto = receipt.toDTO()
let data = try await api.post("/orders", body: dto)
return try JSONDecoder().decode(OrderDTO.self, from: data).toDomain()
}
func list(userId: Int) async throws -> [Order] { ... }
func cancel(orderId: Int) async throws { ... }
}Repositori Berbasis Memori untuk Pengujian
Sediakan repositori berbasis memori untuk pengujian yang cepat dan deterministik tanpa operasi masukan/keluaran.
final class InMemoryOrderRepo: OrderRepository {
var orders: [Order] = []
func create(receipt: PaymentReceipt) async throws -> Order {
let order = Order(id: orders.count + 1, items: receipt.items)
orders.append(order)
return order
}
func list(userId: Int) async throws -> [Order] { orders }
func cancel(orderId: Int) async throws { orders.removeAll { $0.id == orderId } }
}Menggabungkan Kasus Penggunaan
Kasus penggunaan dapat memanggil kasus penggunaan lain untuk suboperasi bersama, sehingga masing-masing tetap berfokus.
struct CheckoutUseCase {
let validateCart: ValidateCartUseCase
let placeOrder: PlaceOrderUseCase
let notifyUser: NotifyUserUseCase
func execute(userId: Int) async throws -> Order {
try await validateCart.execute(userId: userId)
let order = try await placeOrder.execute(userId: userId)
try await notifyUser.execute(order: order)
return order
}
}Repositori vs Service
Repositori: operasi buat, baca, perbarui, dan hapus atas satu tipe entitas. Service: mengatur beberapa entitas atau memanggil API eksternal tanpa penyimpanan langsung.
// Repository: single entity
protocol UserRepository { func getUser(id: Int) async throws -> User }
// Service: cross-entity operation
protocol AuthService { func login(email: String, password: String) async throws -> Session }Penyimpanan Tembolok di Repositori
Repositori dapat menyimpan hasil dalam tembolok secara transparan tanpa membuat kasus penggunaan mengetahui detail implementasinya.
struct CachedUserRepository: UserRepository {
private var cache: [Int: User] = [:]
private let remote: UserRepository
func getUser(id: Int) async throws -> User {
if let cached = cache[id] { return cached }
let user = try await remote.getUser(id: id)
cache[id] = user
return user
}
func saveUser(_ user: User) async throws { try await remote.saveUser(user) }
}Kemudahan Pengujian
Karena kasus penggunaan bergantung pada repositori berbasis protokol, Anda dapat menyuntikkan objek pengganti untuk menguji logika bisnis secara terisolasi.
let repo = InMemoryOrderRepo()
let sut = PlaceOrderUseCase(orders: repo, ...)
let order = try await sut.execute(userId: 1)
XCTAssertEqual(repo.orders.count, 1)Penerjemahan Kesalahan
Repositori harus menerjemahkan kesalahan lapisan data (jaringan, basis data) menjadi kesalahan ranah sebelum mengembalikannya.
func getUser(id: Int) async throws -> User {
do {
let data = try await api.get("/users/\(id)")
return try decode(data)
} catch let e as URLError where e.code == .notConnectedToInternet {
throw DomainError.offline
}
}Pemeriksaan Singkat
Apa perbedaan utama antara Repositori dan Service dalam Arsitektur Bersih?
Ringkasan Pelajaran
Kasus penggunaan merangkum satu tindakan bisnis dan bergantung pada protokol repositori. Repositori mengabstraksikan sumber data di balik sebuah protokol. Gunakan repositori berbasis memori untuk pengujian yang cepat. Repositori menerjemahkan kesalahan infrastruktur menjadi kesalahan ranah. Service mengatur operasi yang melibatkan banyak entitas.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Pola Use Case dan Repositori” gratis?
Ya — teks lengkap “Pola Use Case dan Repositori” 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 “Pola Use Case dan Repositori”?
Mendefinisikan use case sebagai protokol Swift dan mengimplementasikan interface repositori. 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 2 dari 4.
Berapa lama pelajaran “Pola Use Case dan Repositori” 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
- Lapisan: Domain, Data, dan Presentasi
- Pola Use Case dan Repositori
- Inversi Dependensi dengan Abstraksi Protokol
- Menghubungkan Lapisan tanpa Framework DI