علاقتا Include و Extend
علاقتا Include و Extend
يتحول مخطط حالات الاستخدام الذي يضم ممثلين وعلاقات ارتباط بسيطة فحسب، سريعاً إلى جدار من الأوبال المتطابقة. يتيح لك النمطان المصنَّفان <<include>> و<<extend>> عزل السلوك المشترك ونمذجة السلوك الاختياري أو المشروط دون تكرار المنطق. إتقانهما هو القفزة الأكبر من المخطط المبتدئ إلى المحترف.
علاقة <<include>>
استخدم <<include>> عندما تستدعي حالة استخدام أخرى دائماً وبصورة غير مشروطة. فكّر فيها على أنها استدعاء دالة فرعية: في كل مرة تُنفَّذ فيها حالة الاستخدام الأساسية، تُنفَّذ الحالة المضمَّنة أيضاً. يشير السهم من حالة الاستخدام الأساسية إلى الحالة المضمَّنة — أي "أنا أستدعيك دائماً".
المحفز الكلاسيكي: تلاحظ أن حالتَي استخدام أو أكثر تتشاركان كتلة كبيرة من الخطوات المتطابقة. بدلاً من تكرار هذا المنطق، تستخرجه كحالة استخدام مستقلة ثم تُضمِّنها عبر <<include>> في كلا المستدعيَين.
مثال — صيدلية إلكترونية: تستلزم كلٌّ من تقديم طلب وتجديد وصفة طبية مصادقة العميل. تُستخرج عملية المصادقة كحالة استخدام مستقلة وتُضمَّن في كلتيهما.
لاحظ الأسهم: كلتا حالتَي الاستخدام الأساسيتين تشيران نحو Authenticate Customer. هذه هي القاعدة المحددة — تشير حالة الاستخدام الأساسية نحو الحالة المضمَّنة. إن رسمته بالاتجاه المعاكس، يُقرأ على أنه الحالة المضمَّنة هي التي تستدعي الحالة الأساسية، وهو خطأ.
علاقة <<extend>>
استخدم <<extend>> عندما تُضيف حالة استخدام سلوكاً اختيارياً أو مشروطاً إلى أخرى. تنفَّذ الامتداد فقط في ظروف معينة — فهي تنويع وليست روتيناً فرعياً مضموناً. يشير السهم من حالة الاستخدام الموسِّعة إلى حالة الاستخدام الأساسية، وهو عكس <<include>>. اقرأها هكذا: "أنا أوسِّعك عند تحقق شرط معين".
المحفز الكلاسيكي: لديك تدفق أساسي يعمل بكفاءة تامة، لكن ثمة مسار اختياري يسلكه بعض المستخدمين فقط — أو لا ينطلق إلا في ظروف محددة. نمذجته كـ<<extend>> تُبقي حالة الاستخدام الأساسية نظيفة وواضحة.
مثال — حجز موعد في عيادة: حالة الاستخدام الأساسية هي حجز موعد. في ظروف معينة (مثلاً اختار المريض طبيباً محدداً أو رُفع علم حالة مزمنة)، قد يُضيف النظام اختيارياً طلب خطاب إحالة أو إخطار طبيب الأسرة.
مقارنة جنباً إلى جنب
يُلخّص الجدول أدناه الفرق الجوهري. احفظه قبل مراجعتك التالية للمخطط.
<<include>> و<<extend>> يشيران في اتجاهين متعاكسين. إن كانت جميع أسهمك المتقطعة تشير في الاتجاه ذاته، فثمة خطأ ما.
مثال مُدمَج: مكتبة إلكترونية
تستخدم الأنظمة الحقيقية كلتا العلاقتين معاً. تُوضِّح المكتبة أدناه ذلك في مخطط واحد. تتضمن البحث في الفهرس دائماً تسجيل استعلام البحث (متطلب تدقيق). وتتضمن استعارة كتاب دائماً التحقق من العضوية. ويُوسِّع سلوكان اختياريان حالة استعارة كتاب: يُطلَق تطبيق غرامة فقط عند وجود رصيد متأخر، ويُطلَق إرسال تذكير SMS فقط عند تفعيل الإشعارات.
دليل اتخاذ القرار العملي
عندما تكون أمام السبورة البيضاء وغير متأكد من أي العلاقتين تستخدم، اطرح على نفسك سؤالين:
- هل السلوك مطلوب في كل مرة بلا استثناء؟ إن كانت الإجابة نعم →
<<include>>. حالة الاستخدام الأساسية غير مكتملة بدونه. - هل هو اختياري، نادر، أو مشروط؟ إن كانت الإجابة نعم →
<<extend>>. حالة الاستخدام الأساسية تعمل بشكل مثالي بدونه.
اختبار ثانوي: هل يمكنك حذف حالة الاستخدام المرشحة دون إفساد التدفق الأساسي؟ إن نعم → على الأرجح <<extend>>. إن انهار التدفق الأساسي بدونها → <<include>> بالتأكيد.
<<include>> أو <<extend>> تُضيفه هو التزام بتوثيق العلاقة في السيناريوهات المكتوبة. لا تُنمذَج المسارات الاختيارية إلا إن كانت ذات أهمية حقيقية للعمل. الإفراط في استخدام <<extend>> لكل تنويع طفيف ينتج مخططات يصعب صيانتها.
ملخص
<<include>>: تُنفَّذ دائماً؛ يشير السهم من الأساسية إلى المضمَّنة؛ تُستخدم لاستخراج السلوك الإلزامي المشترك.<<extend>>: مشروطة أو اختيارية؛ يشير السهم من الموسِّعة إلى الأساسية؛ تُستخدم للتدفقات الإضافية أو الاستثنائية.- كلتاهما تستخدمان أسهماً متقطعة مع نمط بين علامتي « » — الاتجاه فقط هو ما يختلف.
- أعلن عن نقطة امتداد على شكل البيضاوي لحالة الاستخدام الأساسية كلما احتاج شرط الإطلاق إلى توصيل واضح.