0Pricing
Swift Academy · درس

عكس التبعيات باستخدام تجريدات البروتوكولات

اعتمدوا على التجريدات لا على التنفيذات الملموسة، باستخدام بروتوكولات Swift كحدود.

عكس التبعيات باستخدام تجريدات البروتوكولات درس مجاني في Swift Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Swift Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Swift Academy 4 دروس في المجموع.

مبدأ عكس التبعية

ينبغي ألا تعتمد الوحدات عالية المستوى على الوحدات منخفضة المستوى. بل ينبغي أن تعتمد كلتاهما على التجريدات (البروتوكولات).

// WITHOUT DIP:
class OrderService { let db = SQLiteDatabase() }  // depends on concrete
// WITH DIP:
class OrderService { let db: Database }  // depends on abstraction

تعريف التجريد

استخرج بروتوكولًا يعبّر عن العقد الذي تحتاج إليه وحدتك عالية المستوى.

protocol Database {
  func save<T: Encodable>(_ value: T, key: String) throws
  func load<T: Decodable>(key: String) throws -> T
}

التطبيقات الملموسة

وفر تطبيقات ملموسة متعددة خلف البروتوكول: تطبيقًا للإنتاج، وآخر للاختبار، وتطبيقات بديلة مستقبلية.

class SQLiteDatabase: Database { ... }
class InMemoryDatabase: Database { ... }
class KeychainDatabase: Database { ... }

الحقن عبر المُنشئ

مرّر التجريد عبر المُهيئ — فهذا أكثر أساليب الحقن وضوحًا وقابلية للاختبار.

class ProfileService {
  private let db: Database
  init(db: Database) { self.db = db }
}

لماذا لا نستخدم Singleton لكل شيء؟

تخفي كائنات Singleton العامة التبعيات، مما يجعل فهم الشيفرة واختبارها صعبًا.

// Hard to test:
class Service { func run() { MySingleton.shared.doWork() } }
// Easy to test:
class Service { let dep: MyProtocol; func run() { dep.doWork() } }

تجريدات البروتوكولات في Swift

يمكن أن تحتوي بروتوكولات Swift على أنواع مرتبطة، وتطبيقات افتراضية، وتركيب؛ مما يجعلها مثالية للتجريدات الغنية.

protocol Cacheable {
  associatedtype Key: Hashable
  associatedtype Value
  func get(_ key: Key) -> Value?
  func set(_ key: Key, value: Value)
}

دقة التجريد

فصل الواجهات: فضّل البروتوكولات الضيقة على البروتوكولات الضخمة، حتى توفر التطبيقات ما يحتاج إليه المستدعون فقط.

// Fat (avoid):
protocol DataStore {
  func save(...); func load(...); func delete(...); func query(...); func migrate()
}
// Narrow (prefer):
protocol Readable { func load<T>(...) throws -> T }
protocol Writable { func save<T>(...) throws }

مبدأ عكس التبعية مع Combine

أرجع AnyPublisher من أساليب البروتوكول حتى يظل نوع الناشر الأساسي مخفيًا.

protocol UserStream {
  func userUpdates() -> AnyPublisher<User, Never>
}

مبدأ عكس التبعية مع async/await

تتوافق أساليب البروتوكول الموسومة بـ async throws توافقًا كاملًا مع التزامن المنظم في Swift.

protocol Analytics {
  func track(event: String) async
}
struct FirebaseAnalytics: Analytics {
  func track(event: String) async { /* Firebase call */ }
}

مبدأ عكس التبعية على مستوى التطبيق

اربط التطبيقات الملموسة عند نقطة دخول التطبيق (جذر التركيب)، مع إبقاء جميع عمليات الربط في مكان واحد.

@main
struct MyApp: App {
  let db: Database = SQLiteDatabase()
  let repo: UserRepository = RemoteUserRepository(db: db)
  let useCase = FetchUserUseCase(repo: repo)
  var body: some Scene {
    WindowGroup { ContentView(useCase: useCase) }
  }
}

الاختبار باستخدام مبدأ عكس التبعية

في الاختبارات، استبدل التطبيقات الحقيقية بكائنات محاكاة أو بدائل عند موضع الحقن.

let mockDB = InMemoryDatabase()
let service = ProfileService(db: mockDB)
// Exercise service
XCTAssertEqual(try mockDB.load(key: "profile"), expectedProfile)

تحقق سريع

ماذا ينص مبدأ عكس التبعية بشأن الوحدات عالية المستوى؟

مراجعة الدرس

ينص مبدأ عكس التبعية على اعتماد الوحدات عالية المستوى على تجريدات البروتوكولات، مع تطبيق الأنواع الملموسة لها. استخرج بروتوكولات ضيقة، ومرّر التبعيات عبر المُنشئات، واربط كل شيء في جذر التركيب. يتيح ذلك تبديل التطبيقات لأغراض الاختبار، وتفعيل الميزات، وتلبية المتطلبات المستقبلية.

الأسئلة الشائعة

هل درس «عكس التبعيات باستخدام تجريدات البروتوكولات» مجاني؟

نعم — نص درس «عكس التبعيات باستخدام تجريدات البروتوكولات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Swift Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Swift Academy 4 دروس في المجموع.

ماذا ستتعلم في «عكس التبعيات باستخدام تجريدات البروتوكولات»؟

اعتمدوا على التجريدات لا على التنفيذات الملموسة، باستخدام بروتوكولات Swift كحدود. تتمرن على Swift Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Swift Academy؟

لا تُشترط خبرة سابقة. Swift Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «عكس التبعيات باستخدام تجريدات البروتوكولات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Swift Academy هذا؟

نعم. كل درس في Swift Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الطبقات: النطاق والبيانات والعرض
  2. أنماط حالات الاستخدام والمستودع
  3. عكس التبعيات باستخدام تجريدات البروتوكولات
  4. وصل الطبقات معًا دون إطار DI
← العودة إلى Swift Academy