عمال النظيفة سويفت الهندسة المعمارية

مرحبا القارئ!

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



نظرية


العمال هم فصول / هياكل مساعدة (يجب عدم الخلط بينها وبين الخدمات أو المساعدين) تتمثل مهمتها في تولي جزء من منطق عمل Interactor . إذا كانت الطرق في Interactor تتوسع ، فقد حان الوقت لإخراج المنطق الضخم في Worker . في Clean Swift ، يتم استخدامها للعمل مع منطق تخزين البيانات ، مع الشبكة ، مع طبقات فردية من التطبيق ، وهلم جرا. بمعنى آخر ، كل شيء ضخم ومستوى منخفض ولا يرتبط بالمنطق التجاري للتطبيق.

ينقسم العمال إلى نوعين رئيسيين:

  1. محلي يستخدم فقط داخل المشهد.
  2. العالمية المتاحة لأي مشهد.

يتم وضع العمال المحليين مباشرة داخل المشهد ويتم تسميتهم على اسمها - SceneNameWorker . توجد Global Workers في الدليل الجذر Workers وتتم تسميتها وفقًا لموضوعها. يمكن للعمال المحليين أيضًا أن يكونوا " عمال ديكور على المستوى العالمي" ، مع منطق ممتد لاحتياجات المشهد.

إذا كنت تستخدم فصل المشروع إلى طبقات ( العرض التقديمي ، منطق الأعمال ، الثبات ، منطق الشبكة ) ، فيمكن تعيين دور جسر الاتصال بين طبقة العرض التقديمي و Business Logic إلى العمال . وبالتالي ، سنقوم بتفريغ Interactor ، والحصول على سلوك أكثر قابلية للتنبؤ وسهولة إعادة الاستخدام.

ممارسة


عمل العمال سننظر في مثال العمل مع الشبكة. سيكون لدينا شاشتان - في أول قائمة المستخدمين يتم عرضها ، وفي الثانية قائمة من منشورات هذا المستخدم. سيتم اتخاذ جميع البيانات عن طريق API . سنقسم هذه المهمة إلى ثلاثة عمال ، اثنان محليين وواحد عالمي ، سيكون بمثابة نقطة دخول للاثنين الآخرين. سأخفي تنفيذ الأساليب نفسها في المقالة ، ومن يريد أن يجرب في الممارسة ، سيكون هناك رابط للمشروع النهائي في نهاية المقال.



بنية المشروع هذه ليست مرجعًا للعمل مع شبكة ولا تعكس بأي طريقة كيفية التعامل معها في Clean Swift . كل هذا يتم فقط لمثال جيد لدور العمال المحليين والعالميين.

للبدء ، قم بإنشاء Worker عالمي - NetworkWorker . ضعه في دليل العمال ، في نفس مستوى دليل المشاهد . في المثال أدناه ، هناك طريقة sendRequest (إلى: params: complet) ، والتي ستكون مشتركة بين العمال المحليين. ينفذ مهمة روتينية - يشكل رابطًا من المعلمات ، ويرسل طلبًا ويرسل النتيجة إلى الاكتمال .

struct NetworkWorker { // MARK: - Private Properties private let session = URLSession.shared // MARK: - Public Methods ///  Worker.    API /// /// - Parameters: /// - to: ,     /// - params:    /// - completion:     func sendRequest(to: URL, params: [String: String], completion: @escaping (Data?, Error?) -> Void) { // ... } } 

للمشهد الأول ، نحتاج إلى الحصول على قائمة API لجميع المستخدمين. للقيام بذلك ، نقوم بإنشاء HomeWorker محليًا يقوم بتكوين المعلمات لتحميل المستخدمين واستدعاء sendRequest (إلى: params: complet ) في NetworkWorker مع هذه المعلمات. الآن في Interactor للمشهد ، نحتاج إلى استدعاء fetchUsers (الاكتمال :) وإرسال البيانات المستلمة للمعالجة إلى مقدم العرض .

عند النقر فوق خلية جدول باستخدام اسم المستخدم ، سنقوم بالانتقال ونقل المستخدم المحدد إلى مشهد آخر.

 struct HomeWorker { // MARK: - Private Properties private let networkWorker = NetworkWorker() private let usersURL = URL(string: "https://jsonplaceholder.typicode.com/users") // MARK: - Public Methods ///  Worker.   API     /// /// - Parameter complete:     func fetchUsers(_ complete: @escaping ([User]?) -> Void) { // ... } } 

في الصفحة التي تحتوي على منشورات المستخدم ، نقوم بإنشاء PostsWorker ، ولكن فقط باستخدام fetchPosts (userId: completed :) method. نمر فيه معرف المستخدم الذي تريد تنزيل منشوراته. في الطريقة ، نقوم بتكوين المعلمات وندعو sendRequest (إلى: params: complet ) في NetworkWorker . وبنفس الطريقة كما كان من قبل ، فإننا ندعو fetchPosts (userId: completed :) method في Interactor للمشهد ، لتمرير البيانات المستلمة إلى مقدم العرض .

 struct PostsWorker { // MARK: - Private Properties private let networkWorker = NetworkWorker() private let postsURL = URL(string: "https://jsonplaceholder.typicode.com/posts") // MARK: - Public Methods ///   API      /// /// - Parameters: /// - userId: ID ,     /// - completed:     func fetchPosts(userId: Int, _ completed: @escaping ([Post]?) -> Void) { // ... } } 

الآن تم نقل تطبيقنا بالكامل لفصل الملفات التي يمكن إعادة استخدامها ، دون تحميل منطق العمل في Interactor .

استنتاج


على الرغم من أن العمال بسيطون للغاية ولا يكشفون عن أي معرفة خفية حول الهندسة المعمارية ، إلا أن استخدامها مهم في Clean Swift . عند كتابة العمال ، لا تنس البروتوكولات والأنماط الهيكلية و DI. خلاف ذلك ، سوف تشكل بسرعة فوضى العمال ، حيث تم إخراج كل ما يمكن أخذه على شكل قطع.

هذا كل شيء. شكرًا لك على القراءة حتى النهاية ، فيما يلي رابط للمشروع بالكامل.

سلسلة من المقالات


  1. نظرة عامة على هندسة سويفت النظيفة
  2. توجيه البيانات ونقلها في النظيفة سويفت الهندسة المعمارية
  3. عمال الهندسة النظيفة سويفت (أنت هنا)
  4. اختبار وحدة في الهندسة النظيفة سويفت
  5. مثال على بنية متجر بسيط عبر الإنترنت Clean Swift

رابط للمشروع
مساعدة في كتابة مقال: باستيان

Source: https://habr.com/ru/post/ar465991/


All Articles