0Pricing
Swift Academy · บทเรียน

ชั้นต่าง ๆ: โดเมน ข้อมูล และการนำเสนอ

แยกตรรกะทางธุรกิจออกจากการเข้าถึงข้อมูลและ UI ในแอป Swift

ชั้นต่าง ๆ: โดเมน ข้อมูล และการนำเสนอ เป็นบทเรียน Swift Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Swift Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

สถาปัตยกรรมแบบสะอาดในสวิฟต์

สถาปัตยกรรมแบบสะอาดแบ่งโค้ดออกเป็นชั้นต่าง ๆ ได้แก่ โดเมน (ตรรกะทางธุรกิจ) ข้อมูล (การจัดเก็บถาวรและเครือข่าย) และการนำเสนอ (ส่วนติดต่อผู้ใช้)

// Domain: pure Swift, no framework imports
// Data: Core Data / URLSession / JSON
// Presentation: SwiftUI / UIKit

ชั้นโดเมน

ชั้นโดเมนประกอบด้วยเอนทิตีทางธุรกิจ กรณีการใช้งาน และโปรโตคอลของรีโพซิทอรี โดยไม่มีการพึ่งพา UIKit, SwiftUI หรือฐานข้อมูล

// Domain/Entities/User.swift
struct User {
  let id: Int
  var name: String
  var email: String
}
// No import UIKit, no import SwiftData

กรณีการใช้งานในโดเมน

กรณีการใช้งานจะห่อหุ้มการดำเนินการทางธุรกิจเฉพาะอย่างหนึ่งไว้ และพึ่งพาเฉพาะโปรโตคอลของรีโพซิทอรีจากโดเมนเท่านั้น

// Domain/UseCases/FetchUserUseCase.swift
struct FetchUserUseCase {
  let repo: UserRepository
  func execute(id: Int) async throws -> User {
    try await repo.getUser(id: id)
  }
}

โปรโตคอลของรีโพซิทอรีในโดเมน

โปรโตคอลของรีโพซิทอรีกำหนดสัญญาสำหรับการเข้าถึงข้อมูล โดเมนเป็นเจ้าของโปรโตคอล ส่วนชั้นข้อมูลจัดเตรียมการนำไปใช้งาน

// Domain/Repositories/UserRepository.swift
protocol UserRepository {
  func getUser(id: Int) async throws -> User
  func saveUser(_ user: User) async throws
}

ชั้นข้อมูล

ชั้นข้อมูลนำโปรโตคอลของโดเมนไปใช้งานด้วยเทคโนโลยีที่เป็นรูปธรรม เช่น URLSession, Core Data, SwiftData และ Keychain

// Data/Repositories/RemoteUserRepository.swift
struct RemoteUserRepository: UserRepository {
  func getUser(id: Int) async throws -> User {
    let data = try await URLSession.shared.data(from: userURL(id)).0
    return try JSONDecoder().decode(User.self, from: data)
  }
  func saveUser(_ user: User) async throws { /* PUT request */ }
}

อ็อบเจ็กต์สำหรับถ่ายโอนข้อมูล

อ็อบเจ็กต์สำหรับถ่ายโอนข้อมูลเป็นชนิดที่เข้ารหัสและถอดรหัสได้ ซึ่งใช้ในชั้นข้อมูลเพื่อถอดรหัสการตอบกลับจากส่วนติดต่อโปรแกรมประยุกต์ แล้วจึงแปลงเป็นเอนทิตีของโดเมน

struct UserDTO: Decodable {
  var user_id: Int
  var full_name: String
  func toDomain() -> User { User(id: user_id, name: full_name, email: "") }
}

ชั้นการนำเสนอ

ชั้นการนำเสนอประกอบด้วย ViewModels และมุมมอง SwiftUI โดยเรียกใช้กรณีการใช้งานและเปิดเผยสถานะที่สังเกตการณ์ได้

// Presentation/ViewModels/ProfileViewModel.swift
@MainActor
final class ProfileViewModel: ObservableObject {
  @Published var user: User?
  private let useCase: FetchUserUseCase
  init(useCase: FetchUserUseCase) { self.useCase = useCase }
  func load(id: Int) async {
    user = try? await useCase.execute(id: id)
  }
}

ทิศทางการพึ่งพา

การพึ่งพาจะชี้เข้าด้านใน ได้แก่ การนำเสนอพึ่งพาโดเมน และข้อมูลพึ่งพาโดเมน ส่วนโดเมนไม่พึ่งพาสิ่งใด

// Outer → Inner dependency rule:
Presentation → Domain ← Data
// Domain is the stable core; outer layers are swappable

โครงสร้างโฟลเดอร์

สำหรับแอปขนาดใหญ่ ให้จัดระเบียบไฟล์สวิฟต์ตามชั้นก่อน แล้วจึงจัดตามฟีเจอร์

// MyApp/
// ├── Domain/
// │   ├── Entities/
// │   ├── UseCases/
// │   └── Repositories/  (protocols)
// ├── Data/
// │   └── Repositories/  (implementations)
// └── Presentation/
//     ├── Views/
//     └── ViewModels/

ประโยชน์

สถาปัตยกรรมแบบแบ่งชั้นช่วยให้ทดสอบแต่ละส่วนได้อย่างอิสระ สลับการนำไปใช้งานได้ และช่วยให้ทีมพัฒนาหลายทีมทำงานคู่ขนานกันได้

// Test Domain in isolation: no network, no DB
// Swap RemoteUserRepo with LocalUserRepo for offline mode
// Teams own layers independently

ข้อผิดพลาดที่พบบ่อย

หลีกเลี่ยงการนำเข้า UIKit หรือ SwiftUI ในชั้นโดเมน และหลีกเลี่ยงไม่ให้ตรรกะทางธุรกิจรั่วไหลเข้าไปในมุมมอง

// WRONG: Domain entity with SwiftUI Color
struct Product {
  var color: Color  // UIKit/SwiftUI import in Domain!
}
// CORRECT: Use a plain string or enum
struct Product { var colorHex: String }

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ในสถาปัตยกรรมแบบสะอาด ชั้นใดเป็นเจ้าของโปรโตคอลของรีโพซิทอรี

สรุปบทเรียน

ชั้นของสถาปัตยกรรมแบบสะอาด ได้แก่ โดเมน (เอนทิตี กรณีการใช้งาน และสัญญาโปรโตคอล) ข้อมูล (การนำเครือข่ายและฐานข้อมูลไปใช้งาน) และการนำเสนอ (ส่วนติดต่อผู้ใช้และ ViewModels) การพึ่งพาจะชี้เข้าหาโดเมน โดเมนไม่มีการพึ่งพากรอบงานเลย จึงสามารถทดสอบหน่วยได้อย่างสมบูรณ์

คำถามที่พบบ่อย

บทเรียน “ชั้นต่าง ๆ: โดเมน ข้อมูล และการนำเสนอ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ชั้นต่าง ๆ: โดเมน ข้อมูล และการนำเสนอ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Swift Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Swift Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ชั้นต่าง ๆ: โดเมน ข้อมูล และการนำเสนอ”

แยกตรรกะทางธุรกิจออกจากการเข้าถึงข้อมูลและ UI ในแอป Swift คุณปฏิบัติ Swift Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Swift Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Swift Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ชั้นต่าง ๆ: โดเมน ข้อมูล และการนำเสนอ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Swift Academy นี้ได้ไหม

ได้ บทเรียน Swift Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ชั้นต่าง ๆ: โดเมน ข้อมูล และการนำเสนอ
  2. รูปแบบกรณีใช้งานและคลังข้อมูล
  3. การกลับทิศทางการพึ่งพาด้วยนามธรรมของโพรโทคอล
  4. เชื่อมชั้นต่าง ๆ เข้าด้วยกันโดยไม่ใช้เฟรมเวิร์ก DI
← กลับไปที่ Swift Academy