Swift Academy · Pelajaran

Corak Kes Penggunaan dan Repositori

Takrifkan kes penggunaan sebagai protokol Swift dan laksanakan antara muka repositori.

Pelajaran 2 daripada 413 langkah

Corak Kes Penggunaan dan Repositori ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 2 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.

Apakah Kes Penggunaan?

Kes penggunaan (pengantara) merangkum satu tindakan perniagaan, dengan menyelaraskan entiti domain 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)
  }
}

Tanggungjawab Tunggal

Setiap kes penggunaan melakukan tepat satu perkara. Pelbagai tanggungjawab bermaksud pelbagai kes penggunaan.

// One use case per business action:
struct FetchUserUseCase { ... }
struct UpdateUserUseCase { ... }
struct DeleteUserUseCase { ... }

Kes Penggunaan sebagai Protokol

Tentukan protokol untuk kes penggunaan supaya kes tersebut boleh digantikan dengan objek olok-olok dalam ujian lapisan persembahan.

protocol PlacingOrder {
  func execute(userId: Int) async throws -> Order
}
struct PlaceOrderUseCase: PlacingOrder { ... }

Apakah Repositori?

Repositori mengabstrakkan sumber data. Pemanggil berinteraksi dengan protokol Swift; implementasinya mungkin menggunakan rangkaian, 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 konkrit menterjemahkan panggilan domain kepada operasi rangkaian atau pangkalan 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 Dalam Memori untuk Ujian

Sediakan repositori dalam memori untuk ujian yang pantas dan deterministik tanpa input/output.

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 Kes Penggunaan

Kes penggunaan boleh memanggil kes penggunaan lain untuk suboperasi yang dikongsi, sambil mengekalkan fokus setiap kes.

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 berbanding Perkhidmatan

Repositori: operasi CRUD terhadap satu jenis entiti. Perkhidmatan: menyelaraskan berbilang entiti atau memanggil API luaran 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 Sementara dalam Repositori

Repositori boleh menyimpan hasil secara telus tanpa kes penggunaan mengetahui perincian 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) }
}

Kebolehujian

Oleh sebab kes penggunaan bergantung pada repositori berprotokol, anda boleh menyuntik pengganti untuk menguji logik perniagaan secara berasingan.

let repo = InMemoryOrderRepo()
let sut = PlaceOrderUseCase(orders: repo, ...)
let order = try await sut.execute(userId: 1)
XCTAssertEqual(repo.orders.count, 1)

Penterjemahan Ralat

Repositori hendaklah menterjemahkan ralat lapisan data (rangkaian, pangkalan data) kepada ralat domain 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
  }
}

Semakan Pantas

Apakah perbezaan utama antara Repositori dengan Perkhidmatan dalam Seni Bina Bersih?

Ringkasan Pelajaran

Kes penggunaan merangkum tindakan perniagaan tunggal dan bergantung pada protokol repositori. Repositori mengabstrakkan sumber data di sebalik protokol. Gunakan repositori dalam memori untuk ujian yang pantas. Repositori menterjemahkan ralat infrastruktur kepada ralat domain. Perkhidmatan menyelaraskan operasi yang melibatkan berbilang entiti.

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 “Corak Kes Penggunaan dan Repositori” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “Corak Kes Penggunaan dan Repositori”, 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 “Corak Kes Penggunaan dan Repositori”?

Takrifkan kes penggunaan sebagai protokol Swift dan laksanakan antara muka repositori. 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 2 daripada 4.

Berapa lamakah pelajaran “Corak Kes Penggunaan dan Repositori” 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. Lapisan: Domain, Data dan Persembahan
  2. Corak Kes Penggunaan dan Repositori
  3. Penyongsangan Kebergantungan dengan Abstraksi Protokol
  4. Menyambungkan Lapisan tanpa Rangka Kerja DI
← Kembali ke Swift Academy