في هذه المقالة ، أريد التفكير في طريقة لتقسيم المهام إلى مهام فرعية عند استخدام Clean Architecture.
تمت مصادفة مشكلة التحلل من قبل فريق تطوير المحمول NullGravity وأدناه كيف تم حلها وما حدث في النهاية.

قبل التاريخ
كان خريف عام 2018 ، كنا نعمل على تطوير التطبيق التالي لمشغل الاتصالات. لكن هذه المرة كانت مختلفة. كانت الشروط ضيقة جدًا وترتبط بحملة التسويق الخاصة بالعميل. نما فريق Android من 3 إلى 6-7 مطورين. تم تنفيذ العديد من المهام في سباق السرعة والسؤال هو كيف تتحلل بشكل فعال.
ماذا نعني عندما نتحدث بفعالية:
- الحد الأقصى لعدد المهام المتوازية.
هذا يجعل من الممكن شغل جميع الموارد المتاحة. - تقليل حجم طلبات الدمج.
لن تتم مشاهدتها للعرض ، ولا يزال بإمكانك مواجهة المشكلات المحتملة في مرحلة مراجعة التعليمات البرمجية. - تقليل عدد تعارضات الدمج.
سوف تتدفق المهام بشكل أسرع ولا توجد حاجة إلى تبديل المطور إلى حل التعارض. - فرصة لجمع إحصاءات نفقات الوقت.
- أتمتة إنشاء المهام في جيرا.
كيف حلنا المشكلة؟
نقسم جميع المهام الفرعية إلى الأنواع التالية:
- معطيات
- نطاق
- فارغ
- UI
- بند
- عرف
- التكامل
تتوافق البيانات والمجال مع الطبقات في الهندسة المعمارية النظيفة.
فارغة ، واجهة المستخدم ، البند والعرف الرجوع إلى طبقة العرض التقديمي.
ينطبق التكامل على طبقات المجال والعرض التقديمي.
الشكل 1. موقع المهام المتعلقة بطبقات العمارة النظيفةدعونا ننظر في كل نوع على حدة.
معطيات
وصف DTO ، API ، العمل مع قاعدة البيانات ، مصدر البيانات ، إلخ.
نطاق
واجهة مستودع ، وصف نماذج الأعمال ، والمتفاعلين.
يتم أيضًا تطبيق واجهة مستودع التخزين في طبقة البيانات.
مثل هذا الفهم غير المنطقي إلى حد ما ، للوهلة الأولى ، مكّن من فصل مهام البيانات وأنواع المجال قدر الإمكان.
UI
إنشاء تخطيط شاشة أساسي وحالات إضافية ، إن وجدت.
بند
إذا كانت الشاشة عبارة عن قائمة بالعناصر ، فكل نوع تحتاج إلى إنشاء نموذج - عنصر. لتعيين عنصر إلى التخطيط ، ستحتاج إلى AdapterDelegate. نستخدم مفهوم
محول التفويض ، ولكن مع بعض
التعديلات .
بعد ذلك ، قم بإنشاء مثال للعمل مع عنصر قائمة في PresentationModel.
فارغ
الفئات الأساسية المطلوبة لمهام مثل واجهة المستخدم أو العنصر: PresentationModel ، Framgent ، layout ، DI module ، AdapterDelagate factory. ربط واجهات والتطبيقات. إنشاء نقطة دخول على الشاشة.
نتيجة المهمة هي شاشة التطبيق. يحتوي على شريط أدوات ، RecyclerView ، ProgressView ، إلخ. وهذا هو ، عناصر واجهة مشتركة ، يمكن تكرار الإضافة بواسطة مطورين مختلفين وقد تؤدي إلى تعارضات دمج لا مفر منها.
عرف
تنفيذ مكون واجهة مستخدم غير قياسي.
هناك حاجة إلى نوع إضافي لفصل تطوير مكون جديد عن مهمة من نوع واجهة المستخدم.
التكامل
تكامل طبقات المجال والعرض.
كقاعدة عامة ، هذه واحدة من أكثر المهام التي تستغرق وقتًا طويلاً. من الضروري تقليل الطبقتين وتحسين النقاط التي كان من الممكن تفويتها في المراحل السابقة.
ترتيب المهمة
مهام مثل البيانات ، فارغة والعرف يمكن أن تبدأ على الفور بعد بدء سباق. فهي مستقلة عن المهام الأخرى.
يتم تنفيذ مهمة المجال بعد مهمة البيانات.
مهام عنصر واجهة المستخدم بعد المهمة الفارغة.
مهمة التكامل هي آخر ما يتم إكماله حيث يتطلب إكمال جميع المهام السابقة.
الشكل 2. الجدول الزمني لتنفيذ المهمةعلى الرغم من حقيقة أن بعض المهام قد تم حظرها بواسطة مهام أخرى ، إلا أنها يمكن أن تبدأ في نفس الوقت أو مع تأخير بسيط. تتضمن هذه المهام المجال و ui و العنصر. وبالتالي ، يتم تسريع عملية التطوير.
الشكل 3. الجدول الزمني لأداء المهام مع الأقفاللكل وظيفة محددة ، يمكن أن تختلف مجموعة المهام.
قد يكون هناك عدد مختلف من المهام فارغة ، واجهة المستخدم ، العنصر والتكامل ، وقد تكون بعض الأنواع ببساطة غائبة.
أتمتة العملية وجمع الإحصاءات
لجمع الإحصاءات عند إنشاء مهمة ، يتم تعيين التصنيف لها. ستتيح لك هذه الآلية في المستقبل تحليل الوقت الذي تقضيه في كل نوع ، وتكوين متوسط التكاليف. المعلومات التي تم جمعها يمكن تطبيقها عند تقييم مشروع جديد.
للأتمتة ، تمكنا أيضا من إيجاد حل. نظرًا لأن المهام نموذجية ، لماذا يجب أن يكون وصفها في جيرا مختلفًا. قمنا بتطوير قوالب للملخص والوصف. في البداية كان مجرد ملف json ، ومحلل Python لهذا الملف ، وتم توصيل Jira REST API لإنشاء المهام.
في هذا النموذج ، استمر البرنامج النصي لمدة عام تقريبًا. لقد تحولت اليوم إلى تطبيق سطح مكتب كامل مكتوب في بيثون باستخدام بنية PyQt و MVP.
ربما كانت MVP كبيرة ، لكن عندما تحطمت النسخة الأولى على Tkinter من إصدار MacOS 10.14.6 ولم تتمكن جميع الفرق من استخدام التطبيق ، فقد أعدنا بسهولة إعادة عرض طريقة العرض لـ PyQt في نصف يوم ونجح. مرة أخرى ، كنا مقتنعين بأن استخدام الأساليب المعمارية ، حتى في هذه المهام البسيطة ، له مزاياه. يتم عرض لقطة شاشة لـ JiraSubTaskCreator في الشكل 4.
الشكل 4. الشاشة الرئيسية JiraSubTaskCreatorالنتائج
- لقد قمنا بتطوير نهج لتحليل المهام في مهام فرعية تعتمد حدها الأدنى على بعضها البعض ؛
- إنشاء قوالب لوصف المهام ؛
- لقد تلقينا طلبات دمج صغيرة ، مما يجعل من الممكن مراجعة التعليمات البرمجية وتغييرها بعناية
- تقليل عدد التعارضات مع دمج طلبات الطلب ؛
- لقد أتيحت لنا الفرصة لتقييم وتحليل الوقت الذي يقضيه في كل نوع من المهام بدقة أكثر ؛
- جزء الآلي للعمل الروتيني.