ชั้นต่าง ๆ: โดเมน ข้อมูล และการนำเสนอ
แยกตรรกะทางธุรกิจออกจากการเข้าถึงข้อมูลและ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ชั้นต่าง ๆ: โดเมน ข้อมูล และการนำเสนอ
- รูปแบบกรณีใช้งานและคลังข้อมูล
- การกลับทิศทางการพึ่งพาด้วยนามธรรมของโพรโทคอล
- เชื่อมชั้นต่าง ๆ เข้าด้วยกันโดยไม่ใช้เฟรมเวิร์ก DI