الطبقات: النطاق والبيانات والعرض
افصلوا منطق الأعمال عن الوصول إلى البيانات وواجهة المستخدم في تطبيق Swift.
الطبقات: النطاق والبيانات والعرض درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.
البنية المعمارية النظيفة في Swift
تفصل البنية المعمارية النظيفة الشيفرة إلى طبقات: المجال (منطق الأعمال)، والبيانات (التخزين والشبكة)، والعرض (واجهة المستخدم).
// 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 */ }
}كائنات نقل البيانات
DTOs هي أنواع Codable تُستخدم في طبقة البيانات لفك ترميز استجابات واجهات برمجة التطبيقات، ثم تحويلها إلى كيانات المجال.
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بنية المجلدات
نظّم ملفات Swift حسب الطبقة، ثم حسب الميزة، عند إنشاء تطبيقات كبيرة.
// 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). تتجه التبعيات إلى الداخل نحو المجال. ولا يعتمد المجال على أي أطر عمل، مما يجعله قابلًا للاختبار بالكامل باختبارات الوحدات.
الأسئلة الشائعة
هل درس «الطبقات: النطاق والبيانات والعرض» مجاني؟
نعم — نص درس «الطبقات: النطاق والبيانات والعرض» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.
ماذا ستتعلم في «الطبقات: النطاق والبيانات والعرض»؟
افصلوا منطق الأعمال عن الوصول إلى البيانات وواجهة المستخدم في تطبيق Swift. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟
لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الطبقات: النطاق والبيانات والعرض»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟
نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الطبقات: النطاق والبيانات والعرض
- أنماط حالات الاستخدام والمستودع
- عكس التبعيات باستخدام تجريدات البروتوكولات
- وصل الطبقات معًا دون إطار DI