UML: مخططات الفئات والكائنات

الأصناف في UML

18 دقيقة الدرس 1 من 10

الأصناف في UML

كل نظام برمجي ستقوم بنمذجته يتألف من أشياء تملك خصائص وتستطيع القيام بأفعال محددة. في لغة UML، تُمثَّل هذه الأشياء بوصفها أصنافاً (Classes). قبل أن ترسم أي خط على مخطط الأصناف، عليك أن تعرف بدقة كيف يُرسم الصنف وماذا يعني كل جزء منه. هذا هو موضوع هذا الدرس.

صندوق الصنف ذو الثلاثة أقسام

يُرسم الصنف في UML على شكل مستطيل مقسّم إلى ثلاثة أقسام أفقية:

  1. قسم الاسم (أعلى الصندوق) — اسم الصنف، يكتب في المنتصف بتنسيق PascalCase، مثل: BookCopy أو Appointment.
  2. قسم السمات (المنتصف) — البيانات التي يحتفظ بها الصنف (خصائصه أو حقوله).
  3. قسم العمليات (أسفل الصندوق) — السلوكيات التي يستطيع الصنف تنفيذها (توابعه أو دواله).
Three-compartment UML class box structure ClassName attributes + attributeName : Type - anotherAttr : Type = default # protectedAttr : Type operations + operationName() : ReturnType - privateOp(param : Type) : void ① الاسم ② السمات ③ العمليات
صندوق الصنف القياسي في UML بأقسامه الثلاثة: الاسم (أعلى)، والسمات (وسط)، والعمليات (أسفل).

رموز الوصول (Visibility Markers)

تبدأ كل سمة وكل عملية برمز يسمى محدد الوصول، وهو رمز واحد يُعلن من يستطيع الوصول إلى هذا العنصر. يحدد معيار UML أربعة رموز:

  • + عام (public) — يمكن الوصول إليه من أي مكان
  • - خاص (private) — يمكن الوصول إليه داخل هذا الصنف فقط
  • # محمي (protected) — يمكن الوصول إليه داخل هذا الصنف والأصناف المشتقة منه
  • ~ حزمة (package) — يمكن الوصول إليه داخل نفس الحزمة أو مساحة الأسماء
نصيحة للمحللين: لا تحتاج إلى تحديد رمز الوصول لكل سمة في مرحلة التحليل. خلال المراحل الأولى لتحليل الأنظمة، من المقبول تماماً إغفال رموز الوصول والتركيز على تحديد السمات والعمليات الصحيحة. أضف رموز الوصول عند الانتقال نحو التصميم والتنفيذ.

صياغة السمات

الصياغة الكاملة للسمة في UML هي:

visibility name : Type [ multiplicity ] = defaultValue { constraint }

عملياً ستكتب أشياء مثل:

- patientName : String - dateOfBirth : Date + isActive : Boolean = true - balance : Decimal { balance >= 0 }

الجزءان : Type و= defaultValue اختياريان، لكنهما ذوا قيمة كبيرة لأنهما يزيلان الغموض عند تسليم العمل للمطورين.

صياغة العمليات

الصياغة الكاملة للعملية هي:

visibility name ( paramName : Type, ... ) : ReturnType

أمثلة من نظام حجز مواعيد العيادة:

+ scheduleAppointment(doctorId : Integer, date : Date) : Appointment + cancelAppointment(appointmentId : Integer) : Boolean - validateSlot(date : Date, time : Time) : Boolean

مثال واقعي: صنف الموعد (Appointment)

تخيّل عيادة خاصة تحجز مواعيد للمرضى. بعد جمع المتطلبات، يحدد المحلل صنفاً باسم Appointment. إليك كيف يُرسم:

Appointment class from a clinic booking system Appointment - appointmentId : Integer - appointmentDate : Date - startTime : Time - durationMinutes : Integer - status : String = "Scheduled" - notes : String + confirm() : void + cancel(reason : String) : Boolean + reschedule(newDate : Date, newTime : Time) : Boolean خاص: يُنفَّذ داخلياً عام: تستدعيه الأصناف الأخرى
صنف Appointment من نظام حجز مواعيد العيادة — السمات خاصة والعمليات عامة.
اتفاقيات التسمية مهمة. أسماء الأصناف أسماء مفردة بتنسيق PascalCase (مثل Appointment لا appointments). أسماء السمات بتنسيق camelCase تبدأ بحرف صغير (مثل appointmentDate). أسماء العمليات أفعال بتنسيق camelCase (مثل confirm وcancel). التسمية المتسقة تجعل المخططات مقروءة لجميع أعضاء الفريق.

ما يُوضع في السمات وما يُوضع في العمليات

خطأ شائع في البداية هو الخلط بين البيانات والسلوكيات. استخدم هذه القاعدة:

  • السمة — حقيقة أو خاصية تصف الكائن. تكون اسماً أو تعبيراً اسمياً: price، emailAddress، quantity.
  • العملية — شيء يستطيع الكائن فعله أو حسابه. تكون فعلاً أو تعبيراً فعلياً: calculateTotal()، sendConfirmation()، isExpired().

في متجر إلكتروني، يحتوي الصنف Product على price وstockLevel كسمات، لكن applyDiscount(rate : Decimal) وcheckAvailability(quantity : Integer) كعمليات. البيانات تسكن في السمات؛ المنطق يسكن في العمليات.

إخفاء الأقسام

في المخططات الكبيرة التي تضم أصنافاً كثيرة، يجعل إظهار كل سمة وكل عملية الرسم غير مقروء. يتيح معيار UML إخفاء أي من القسمين السفليين. القسم الأوسط أو الأسفل الفارغ يعني الإخفاء المتعمد، لا أن الصنف فارغ فعلاً. ستجد نفسك كثيراً ترسم مخططات عالية المستوى تُظهر أسماء الأصناف فقط، ثم تضيف التفاصيل فقط للأصناف الأكثر صلة بالنقاش الجاري.

لا تخلط بين الإخفاء والحذف. إذا أُغفل قسم كلياً (أي أن الصندوق أصبح بقسمين فقط)، تأكد أن جمهورك يعلم أن الإخفاء كان متعمداً. من الممارسات الشائعة إضافة علامة الحذف (...) داخل القسم الفارغ لتوضيح النية.

ملخص

لكل صنف UML صندوق بثلاثة أقسام: الاسم في الأعلى، والسمات في الوسط، والعمليات في الأسفل. تسبق رموز الوصول (+، -، #، ~) كل عنصر. اتباع الصياغة الدقيقة للسمات والعمليات — النوع، القيمة الافتراضية، المعاملات، نوع القيمة المُعادة — يزيل الغموض ويجعل نماذجك مفيدة مباشرةً للمطورين. في الدرس التالي ستتعلم كيف تكتشف هذه الأصناف بقراءة وثائق المتطلبات الحقيقية وتحليلها.