0Pricing
Swift Academy · Pelajaran

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

  1. Lapisan: Domain, Data, dan Presentasi
  2. Pola Use Case dan Repositori
  3. Inversi Dependensi dengan Abstraksi Protokol
  4. Menghubungkan Lapisan tanpa Framework DI
← Kembali ke Swift Academy