طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 241 · تحليل وتصميم برمجيات الويب
الدرس 10 · الوحدة 4: تحويل المواصفات الوظيفية إلى مواصفات تقنية

مخطط التسلسل وتصميم واجهة API

كيف تصف ما يحدث داخل النظام بين مكوناته، وتستخرج منه مواصفات واجهة البرمجة؟ ⏱ نحو 50 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • ترسم مخطط تسلسل بين مكونات النظام بالطلبات والردود والبدائل.
  • تستخرج نقاط نهاية API من مخطط التسلسل وتوصّفها بالمدخلات والاستجابات.
  • تربط رموز الحالة في المواصفة بسلوك الخادم الفعلي.
  • ترسم مخطط الحالات لكائن يمر بمراحل.

١من الحالة إلى الرسائل: مخطط التسلسل

وصف حالة الاستخدام يقول ما يحدث بين المستخدم والنظام. المواصفات التقنية تحتاج خطوة أعمق: ما يحدث داخل النظام بين مكوناته: الواجهة، والخادم، وقاعدة البيانات، والخدمات الخارجية. هذا ما يرسمه مخطط التسلسل Sequence Diagram: المكونات أعمدة، والرسائل أسهم مرتبة زمنيًّا من الأعلى إلى الأسفل.

diagram.mmd
sequenceDiagram  actor T as المتدرب  participant F as الواجهة  participant S as الخادم  participant D as قاعدة البيانات  participant G as بوابة الدفع  T->>F: يضغط «سجّل»  F->>S: POST /api/enrollments  S->>D: هل توجد مقاعد؟  D-->>S: 3 مقاعد  S->>D: إنشاء تسجيل (pending)  S-->>F: 201 + رقم التسجيل  F->>G: تحويل لصفحة الدفع  alt الدفع ناجح    G->>S: إشعار نجاح الدفع    S->>D: الحالة = paid  else الدفع فشل    G->>S: إشعار فشل    S->>D: إلغاء الحجز  end
بوابة الدفعقاعدة البياناتالخادمالواجهةalt[الدفع ناجح][الدفع فشل]المتدربيضغط «سجّل»POST /api/enrollmentsهل توجد مقاعد؟3 مقاعدإنشاء تسجيل (pending)201 + رقم التسجيلتحويل لصفحة الدفعإشعار نجاح الدفعالحالة = paidإشعار فشلإلغاء الحجز

السهم المتصل ->> طلب، والمتقطع -->> رد. والإطار alt … else … end يرسم مسارين بديلين حسب شرط. جرّب: أضف بعد نجاح الدفع رسالة من الخادم إلى «خدمة الرسائل» تؤكد التسجيل للمتدرب.

الصيغةمعناها
actor T as المتدربممثل بشري (شكل شخص) بمعرّف قصير واسم عربي
participant S as الخادممكوّن من مكونات النظام
F->>S: POST /api/enrollmentsرسالة (طلب) من الواجهة إلى الخادم
S-->>F: 201رد من الخادم إلى الواجهة
alt شرط … else … endمسارات بديلة
loop كل دقيقة … endرسائل تتكرر

٢من الأسهم إلى نقاط النهاية API

كل سهم من الواجهة إلى الخادم في مخطط التسلسل هو نقطة نهاية Endpoint في واجهة البرمجة API يجب توصيفها بدقة، حتى يعمل مطور الواجهة ومطور الخادم بالتوازي دون أن ينتظر أحدهما الآخر:

🔌 مواصفة: POST /api/enrollmentsمواصفة نقطة نهاية
الغرض
إنشاء طلب تسجيل متدرب في دورة (FR-02)
من يستدعيها
متدرب مسجّل الدخول
جسم الطلب
{ "traineeId": 12, "courseId": 1 }
الاستجابات
الرمزمتى
201أُنشئ الطلب بحالة pending، ويعاد الطلب
400حقل مطلوب ناقص
404الدورة غير موجودة
409الدورة مكتملة

والمواصفة الدقيقة تُختبر. هذا خادم مبني منها؛ أرسلنا إليه أربعة طلبات تغطي الحالات كلها:

const express = require('express');const app = express();app.use(express.json()); const courses = [{ id: 1, title: 'تصميم الويب', capacity: 2 }];const enrollments = []; app.post('/api/enrollments', (req, res) => {  const { traineeId, courseId } = req.body;  if (!traineeId || !courseId)    return res.status(400).json({ error: 'traineeId و courseId مطلوبان' });  const course = courses.find(c => c.id === courseId);  if (!course) return res.status(404).json({ error: 'الدورة غير موجودة' });  const taken = enrollments.filter(e => e.courseId === courseId).length;  if (taken >= course.capacity)    return res.status(409).json({ error: 'الدورة مكتملة' });  const e = { id: enrollments.length + 1, traineeId, courseId, status: 'pending' };  enrollments.push(e);  res.status(201).json(e);}); app.listen(3000);

الدورة سعتها 2: الطلبان الأولان 201، والثالث 409 «مكتملة»، والرابع 400 لأن traineeId ناقص. كل رمز في الاستجابات جاء من سطر في المواصفة.

٣دورة حياة الطلب: مخطط الحالات

بعض الكائنات تمر بحالات: طلب التسجيل يكون معلّقًا، ثم معتمدًا، ثم مدفوعًا... مخطط الحالات State Diagram يحدد الحالات المسموحة والانتقالات بينها وما يسببها. يجيب المبرمج عن أسئلة مثل: هل يُدفع طلب مرفوض؟ (لا، لا يوجد سهم).

diagram.mmd
stateDiagram-v2  [*] --> pending : إنشاء الطلب  pending --> approved : اعتماد الموظفة  pending --> rejected : رفض مع السبب  approved --> paid : نجاح الدفع  approved --> cancelled : انتهاء مهلة الدفع  paid --> completed : انتهاء الدورة  rejected --> [*]  cancelled --> [*]  completed --> [*]

إنشاء الطلب

اعتماد الموظفة

رفض مع السبب

نجاح الدفع

انتهاء مهلة الدفع

انتهاء الدورة

pending

approved

rejected

paid

cancelled

completed

كل سهم انتقال مسموح وعليه الحدث الذي يسببه. ما لا سهم له ممنوع: لا انتقال من rejected إلى paid. هذا يصبح في الكود شرطًا يرد بـ 409 إن طُلب انتقال غير مسموح.

توقّع وتحقّق

السهم المتقطع -->> في مخطط التسلسل يمثّل:

ماذا يعني الإطار alt … else … end ؟

الدورة مكتملة. أنسب رمز يرد به الخادم:

تعارض مع حالة المورد.

في مخطط الحالات، طلب rejected لا يوجد سهم منه إلى paid. ماذا يعني؟

الخلاصة

تحدٍّ تصميمي: تسلسل اعتماد الطلب

متقدم

ارسم مخطط تسلسل لاعتماد موظفة التسجيل طلبًا، من ضغطة الزر حتى رسالة النتيجة، مع المسار البديل.

المطلوب:
  • المشاركون: موظفة التسجيل (actor)، والواجهة، والخادم، وقاعدة البيانات، وخدمة الرسائل.
  • الواجهة ترسل إلى الخادم طلب PATCH إلى /api/enrollments/….
  • الخادم يقرأ الطلب من قاعدة البيانات ثم يحدّث حالته.
  • إطار alt: إن كان معلّقًا يُعتمد ويُرسل للمتدرب رسالة ويرد 200، وإلا يرد 409.
  • كل رد من الخادم إلى الواجهة سهم متقطع.
✓ التحقق الآلي: يقرأ المختبر مخططك (العناصر والروابط) ويفحصه
  • المخطط مكتوب بصيغة صحيحة ويُرسم
  • نوعه: مخطط تسلسل sequenceDiagram
  • مشارك «قاعدة البيانات»
  • مشارك «خدمة الرسائل»
  • الواجهة ← الخادم: PATCH /api/enrollments
  • الخادم يرسل إلى قاعدة البيانات
  • الخادم يرسل إلى خدمة الرسائل
  • رد 200 متقطع من الخادم إلى الواجهة
  • رد 409 متقطع من الخادم إلى الواجهة
  • إطار alt … else … end
  • الطلب أولًا ثم القراءة ثم الرد

💡 تلميح 1
أضف المشاركين أولًا: participant D as قاعدة البيانات و participant M as خدمة الرسائل.
💡 تلميح 2
الرد المتقطع: S-->>F: 200 + الطلب المحدّث.
💡 تلميح 3
البديل: alt الطلب معلّق … else ليس معلّقًا … end.

حاول بنفسك أولًا؛ للتصميم أكثر من حلّ صحيح، والفحص يتأكد من العناصر الأساسية فقط.

diagram.mmd
sequenceDiagram  actor R as موظفة التسجيل  participant F as الواجهة  participant S as الخادم  participant D as قاعدة البيانات  participant M as خدمة الرسائل  R->>F: تضغط «اعتماد»  F->>S: PATCH /api/enrollments/7  S->>D: قراءة الطلب  D-->>S: الطلب (pending)  alt الطلب معلّق    S->>D: الحالة = approved    S->>M: رسالة للمتدرب: اعتُمد طلبك    S-->>F: 200 + الطلب المحدّث  else ليس معلّقًا    S-->>F: 409 لا يمكن اعتماده  end  F-->>R: رسالة النتيجة
خدمة الرسائلقاعدة البياناتالخادمالواجهةalt[الطلب معلّق][ليس معلّقًا]موظفة التسجيلتضغط «اعتماد»PATCH /api/enrollments/7قراءة الطلبالطلب (pending)الحالة = approvedرسالة للمتدرب: اعتُمد طلبك200 + الطلب المحدّث409 لا يمكن اعتمادهرسالة النتيجة
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس