السلوك: التسلسل والنشاط
درس 4 من 6
4السلوك: التسلسل والنشاط
مخططان يصوّران الزمن لا البنية. الأول يجيب «من ينادي من وبأي ترتيب؟» والثاني «ما خطوات العملية وقراراتها؟»، وسنرى كيف يكشف أحدهما عطلًا لا يظهر في مخطّط الأصناف أبدًا.
ماذا تشاهد في الرسم: الرسائل تظهر بترتيب حدوثها: العضو يطلب، والمكتبة تفحص التأخّر ثم الحدّ، ثم تنشئ الإعارة. الترتيب نفسه هو ما يحدّد سبب الرفض.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
مخطط الأصناف صورة للبيت وهو فارغ. أما مخطط التسلسل فمقطع فيديو ليوم في البيت: من نادى من، وبأي ترتيب. ومخطط النشاط خريطة خطوات مثل وصفة فيها «إن كان العجين لزجًا فأضف دقيقًا». بعض الأعطال لا تظهر إلا في الفيديو.
مخطط التسلسل sequence فيه خطوط حياة ورسائل متزامنة وغير متزامنة وصناديق alt وloop، ويكشف أخطاء الترتيب والسباقات. ومخطط النشاط activity فيه خطوات وعقد قرار وتفرّع متوازٍ، ويصف سير العمل. كلاهما سلوك عبر الزمن لا بنية.
المتطلبات قبل البداية
الجزء الثالث
مخطّط الأصناف منفَّذًا، والعطل الذي كشفه التشغيل في ترتيب التحقّقات.
فكرة الشرط والفرع
if وelse. المخطّطان هنا مجرّد رسم لهذا.
فكرة الطبقات
أن النظام ليس كتلة واحدة: واجهة تنادي منطقًا ينادي مخزنًا. مخطّط التسلسل كله عن هذه النداءات.
المفاهيم الأساسية
التسلسل: من ينادي من وبأي ترتيب؟ محوره المشاركون والرسائل بينهم. والنشاط: ما خطوات العملية وقراراتها؟ محوره الخطوات والشروط. الأول يكشف الطبقات، والثاني يكشف الفروع.
كل مشارك في مخطّط التسلسل عمود رأسي، والزمن ينزل. الرسالة سهم أفقي، والردّ سهم متقطّع. وهذا كل ما تحتاج معرفته لتقرأ أي مخطّط تسلسل.
alt لفرع شرطي، وloop لحلقة، وopt لخطوة اختيارية. بلا هذه الأطر يصير المخطّط مسارًا سعيدًا فقط، وهذا أكثر ما يُرسم وأقلّ ما يفيد.
في مخطّط النشاط، المعيّن قرار: سهم داخل وأسهم خارجة موسومة بالشروط. كل معيّن في الرسم هو if في الكود، وترتيب المعيّنات هو ترتيب التحقّقات.
مخطّط النشاط يُجبرك على ترتيب الشروط، وهذا بالضبط ما لا يملكه مخطّط الأصناف، ولهذا سيصلح لنا عطل الجزء السابق.
لا يصفان البنية ولا البيانات، ويصيران غير مقروءين فوق عشرة مشاركين أو عشرين خطوة. ومن يرسم مخطّط تسلسل لكل دالة لا يوثّق، بل يعيد كتابة الكود بالرسم.
كيف يعمل؟
شكل 1، الاستعارة كتسلسل: لاحظ أن إطار alt يجعل الرفض مسارًا من الدرجة الأولى لا استثناءً
شكل 2، الاستعارة كنشاط: ثلاثة معيّنات، أي ثلاثة شروط بترتيب مقصود
| التسلسل | النشاط | |
|---|---|---|
| السؤال | من ينادي من؟ | ما الخطوات والقرارات؟ |
| المحور | المشاركون والرسائل | الخطوات والشروط |
| يكشف | الطبقات والاعتماديات | الفروع والترتيب |
| مناسب لـ | تصميم الواجهات بين المكوّنات | قواعد العمل والتحقّقات |
| في الكود | من ينادي من | ترتيب الـif |
التمرين: مخطّط النشاط يصلح عطل الجزء السابق
في الجزء الثالث شغّلنا المخطّط فأخبر النظام عضوًا متأخّرًا وعند الحدّ معًا أنه «بلغ الحدّ» فقط. الرسالة صحيحة ومضلّلة: سيُرجع نسخة ويحاول مرة أخرى فيُرفض لسبب لم يُخبَر به. مخطّط الأصناف لم يستطع كشف هذا لأنه لا يملك مفهوم الترتيب. ومخطّط النشاط أعلاه يملكه.
الترتيب الذي أنتجه مخطّط الأصناف:
# the order the class diagram happened to produce
if len(member.active()) >= MAX_LOANS:
raise ValueError("%s already holds %d copies" % (member.name, MAX_LOANS))
if member.overdue(today):
raise ValueError("%s is overdue and may not borrow" % member.name)والترتيب الذي يطلبه مخطّط النشاط:
# the order the activity diagram demands: the blocking reason first
if member.overdue(today):
raise ValueError("%s is overdue and may not borrow" % member.name)
if len(member.active()) >= MAX_LOANS:
raise ValueError("%s already holds %d copies" % (member.name, MAX_LOANS))$ python3 order_fix.py # member is overdue AND at the limit before the fix -> Muath already holds 5 copies after the fix -> Muath is overdue and may not borrow $ python3 order_fix.py --one # member is overdue with one loan before the fix -> Amal is overdue and may not borrow after the fix -> Amal is overdue and may not borrow
وماذا كشف مخطّط التسلسل؟
انظر إلى السهم S->>S: تحقّق من الأهلية في الرسم. النظام يتحقّق من الأهلية بنفسه، لا المخزن. لو كان السهم S->>D: تحقّق من الأهلية لكانت قاعدة «٥ نسخ» قد سكنت في قاعدة البيانات، فتصير القاعدة التجارية موزّعة على طبقتين ولا أحد يعرف أين تُعدَّل.
alt ومخطّط نشاط بلا معيّن كلاهما يصف أفضل يوم في عمر النظام، وأفضل يوم ليس ما نُصمّم له. الاختبار: لو لم يكن في مخطّطك مسار رفض واحد، فأنت لم ترسم السلوك بل الأمنية.| رمز في الرسم | ما يعنيه | في الكود |
|---|---|---|
| عمود رأسي | مشارك | كائن أو خدمة |
| سهم ممتلئ | رسالة / نداء | نداء دالة |
| سهم متقطّع | ردّ | قيمة الإرجاع |
| سهم يعود للعمود نفسه | نداء ذاتي | منطق داخلي، القاعدة تسكن هنا |
alt | فرع شرطي | if / else |
loop | تكرار | for / while |
| معيّن | قرار | if، وترتيبه مهم |
| مستطيل مستدير | بداية أو نهاية | مدخل الدالة ومخرجها |
اعتقاد شائع × الحقيقة
| الاعتقاد | الحقيقة |
|---|---|
| «التسلسل والنشاط مخططان متشابهان.» | الأول محوره من، والثاني محوره ماذا بأي ترتيب. سؤالان مختلفان تمامًا. |
| «ترتيب الشروط تفصيلة تنفيذ.» | رأيناه يُعطي المستخدم سببًا مضلّلًا فيُرفض مرتين. الترتيب جزء من السلوك. |
| «المخطّط بلا فروع أنظف.» | هو أنظف لأنه ناقص. الرفض هو نصف السلوك، وإطار alt هو مكانه. |
| «ارسم تسلسلًا لكل دالة.» | هذا إعادة كتابة الكود بالرسم. ارسم تسلسلًا حين يكون السؤال «أين يسكن هذا المنطق؟». |
| «النداء الذاتي خط زائد.» | هو أهم خط في المخطّط: يقول إن القاعدة تسكن هنا لا في المخزن ولا في الواجهة. |
جرّب بنفسك
عضو متأخّر وعنده ٥ نسخ. أي رسالة تخدمه أكثر، ولماذا؟
لأن إرجاع أي نسخة يُصلح «الحدّ» ولا يُصلح «التأخير»: لو أخبرناه بالحدّ لحاول مرة أخرى ورُفض بسبب جديد. القاعدة: افحص أولًا السبب الأضيق إصلاحًا. والخيار الرابع يبدو كريمًا لكنه يدفن المطلوب في نص.
مخطّط تسلسل فيه سهم S->>D: تحقّق من الأهلية. ما الذي يقوله هذا عن معماريتك؟
السهم يحدّد مكان القاعدة. ولو سكنت في المخزن (محفّز أو قيد أو إجراء مخزّن) فستُعدَّل في مكان لا يراه مبرمج المنطق، وستختلف بين بيئة وبيئة. ولهذا النداء الذاتي S->>S ليس خطًّا زائدًا بل قرار معماري.
بطاقات مراجعة سريعة
alt يفعل ماذا؟if في الكود، وترتيب المعيّنات هو ترتيب التحقّقات.تحقّق من فهمك
1. بجملة واحدة: لماذا لم يستطع مخطّط الأصناف كشف عطل ترتيب التحقّقات؟
لأن مخطّط الأصناف صورة ساكنة: يقول إن القواعد موجودة ولا يملك مفهوم «قبل» و«بعد». وترتيب التحقّقات سلوك، فمكانه مخطّط النشاط.
2. اشرح بالتفصيل قاعدة «الأضيق إصلاحًا أولًا».
لكل سبب رفض «علاج» يملكه المستخدم. علاج «بلغت الحدّ» إرجاع أي نسخة، وعلاج «عليك تأخير» إرجاع النسخة المتأخّرة بالتحديد، و«النسخة غير متاحة» لا علاج له عند المستخدم أصلًا. فترتيب الفحص من الأضيق علاجًا إلى الأوسع يضمن أن أول رسالة يراها هي الرسالة التي إن عمل بها نجح، بدل أن يدور في حلقة من الرفض ونصيحة لا تكفي. وفي رسمنا جاءت «غير متاحة» أولًا لأنها ليست خطأه، ثم «تأخير»، ثم «الحدّ».
3. (اكتشف الخطأ) مخطّط تسلسل يبدأ بسهم من «واجهة المستخدم» إلى «قاعدة البيانات» مباشرة. ما الخطأ؟
تجاوز طبقة المنطق. والمشكلة ليست جمالية: إن كتبت الواجهة في قاعدة البيانات مباشرة فلن يُفحص أي شرط من الشروط الثلاثة، لأن الشروط تسكن في المنطق كما قال النداء الذاتي. كل سهم يتجاوز طبقة يتجاوز قواعدها معها.
4. العميل يريد إضافة «حجز نسخة» عند عدم التوفّر. ماذا يتغيّر في المخطّطين؟
في مخطّط النشاط: فرع المعيّن الأول («النسخة متاحة؟ لا») يصير عقدة «أنشئ حجزًا» بدل «اعرض الحجز» فقط، وقد يحتاج معيّنًا جديدًا («عنده حجز سابق على هذا الكتاب؟»). وفي مخطّط التسلسل: رسالة جديدة من النظام إلى المخزن لإنشاء الحجز، وغالبًا رسالة إلى فاعل خارجي (إشعار) حين تُرجَع النسخة. والسؤال الذي سيكشفه الرسم: من يملك الأسبقية إذا حجز شخصان؟، وهذا سؤال ما كان ليظهر بلا رسم.
5. (قرار) الفريق يقترح رسم مخطّط تسلسل لكل نقطة في الـAPI (٣٥ نقطة). ما ردّك؟
أن هذا ليس تصميمًا بل نسخة ثانية من الكود بالرسم، وستتعفّن مع أول تعديل. البديل: ارسم تسلسلًا للعمليات التي يمرّ فيها الطلب بثلاث طبقات أو أكثر، أو التي يتعامل فيها النظام مع فاعل خارجي (دفع، إشعار، نظام آخر)، وهذه عادة ثلاث أو أربع عمليات لا ٣٥. أما بقية النقاط فمخطّط نشاط واحد لقواعد التحقّق المشتركة يخدمها كلها. المخطّط الذي لا يجيب عن سؤال لا يُقرأ، والمخطّط الذي لا يُقرأ يصير خاطئًا بصمت.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
مقالات2
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.