مخطط الفئات
مخطط الفئات هو اللبنة الأساسية الرئيسية في النمذجة كائنية التوجه. ويُستخدم في النمذجة العامة للمفاهيم البنيوية للتطبيق، وكذلك في النمذجة التفصيلية لتحويل النموذج إلى كود برمجي. يمكن استخدام مخطط الفئات أيضًا في نمذجة البيانات. وتمثّل الفئات في مخطط الفئات العناصر والتفاعلات الرئيسية في التطبيق، كما تمثّل الفئات التي تحتاج إلى برمجة.
نسخ
تضمين
---
title: Animal example
---
classDiagram
note "From Duck till Zebra"
Animal <|-- Duck
note for Duck "can fly
can swim
can dive
can help in debugging"
Animal <|-- Fish
Animal <|-- Zebra
Animal : +int age
Animal : +String gender
Animal: +isMammal()
Animal: +mate()
class Duck{
+String beakColor
+swim()
+quack()
}
class Fish{
-int sizeInFeet
-canEat()
}
class Zebra{
+bool is_wild
+run()
}
الصيغة
فئة
يوفّر UML آليات لتمثيل أعضاء الفئة، مثل الخصائص والدوال، وما يرتبط بها من معلومات إضافية. ويتضمّن المثيل الواحد للفئة ثلاثة أجزاء:
- يحتوي الجزء العلوي على اسم الفئة. ويُطبع بخط عريض في الوسط، بحرف أول كبير. وقد يحتوي أيضًا على نص تعليق اختياري يصف طبيعة الفئة.
- يحتوي الجزء الأوسط على خصائص الفئة. وتُحاذى إلى اليسار، بحرف أول صغير.
- يحتوي الجزء السفلي على العمليات التي يمكن للفئة تنفيذها. وهي أيضًا محاذاة إلى اليسار بحرف أول صغير.
نسخ
تضمين
---
title: Bank example
---
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +Bigdecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
تعريف فئة
هناك طريقتان لتعريف الفئة
- استخدام صيغة class صراحةً (مثل class Animal)، وهذا يعرّف الفئة Animal.
- عبر علاقة، وهي تعرّف في الوقت نفسه الفئتين والعلاقة بينهما (مثل Vehicle <|-- Car).
نسخ
تضمين
classDiagram
class Animal
Vehicle <|-- Car
قواعد التسمية: لا يجوز أن يتكوّن اسم الفئة إلا من أحرف أبجدية رقمية (بما في ذلك unicode) والشرطة السفلية (_) والشرطة (-).
تسمية الفئة
إذا احتجت إلى توفير تسمية للفئة، يمكنك استخدام الصيغة التالية:
نسخ
تضمين
classDiagram
class Animal["Animal with a label"]
class Car["Car with *! symbols"]
Animal --> Car
يمكنك أيضًا استخدام العلامات الخلفية (``) لإفلات الأحرف الخاصة في التسمية:
نسخ
تضمين
classDiagram
class `Animal Class!`
class `Car Class`
`Animal Class!` --> `Car Class`
تعريف أعضاء الفئة
يوفّر UML آليات لتمثيل أعضاء الفئة (مثل الخصائص والدوال) وما يرتبط بها من معلومات إضافية.
تميّز Mermaid بين الخصائص والدوال أو الطرق بناءً على وجود الأقواس (). فما يحتوي على () يُعدّ دالة أو طريقة، وما عدا ذلك يُعدّ خاصية.
هناك طريقتان لتعريف أعضاء الفئة، وأيًّا كانت الصيغة المستخدمة لتعريف الأعضاء فالنتيجة واحدة. والطريقتان المختلفتان هما:
١، اربط أعضاء الفئة باستخدام النقطتين (:) متبوعة باسم العضو، وهذا مفيد لتعريف عضو واحد في المرة. على سبيل المثال:
نسخ
تضمين
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
٢، اربط أعضاء الفئة باستخدام الأقواس المعقوصة {}، حيث تُجمَّع الأعضاء داخل الأقواس المعقوصة. مناسب لتعريف عدة أعضاء في المرة. على سبيل المثال:
نسخ
تضمين
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount)
+withdrawal(amount)
}
نوع الإرجاع
يمكنك تحديد نوع البيانات الذي سيُرجَع في نهاية تعريف الطريقة أو الدالة. ملاحظة: يجب وجود مسافة بين ')' الأخيرة ونوع الإرجاع. مثال:
نسخ
تضمين
classDiagram
class BankAccount{
+String owner
+BigDecimal balance
+deposit(amount) bool
+withdrawal(amount) int
}
النوع العام
يمكن تمثيل النوع العام كجزء من تعريف الفئة، ويمكن أيضًا استخدامه في أعضاء الفئة أو نوع الإرجاع. لتمثيل عنصر كنوع عام، ضع النوع بين علامتي التلدة (~). يُدعَم الإعلان عن أنواع متداخلة، مثل List<List<int>> ، لكن الأنواع العامة التي تحتوي على فواصل، مثل List<List<K, V>> ، غير مدعومة حاليًا.
نسخ
تضمين
classDiagram
class Square~Shape~{
int id
List~int~ position
setPoints(List~int~ points)
getPoints() List~int~
}
Square : -List~string~ messages
Square : +setMessages(List~string~ messages)
Square : +getMessages() List~string~
Square : +getDistanceMatrix() List~List~int~~
الظهور
لوصف ظهور خاصية أو طريقة/دالة، يمكن استخدام رمز اختياري قبل اسم العضو:
- + عام
- - خاص
- # محمي
- ~ داخلي
تعريف العلاقة
العلاقة مصطلح عام يشمل أنواعًا محدّدة من الروابط المنطقية الموجودة في مخططات الفئات والمخططات الكائنية.
نسخ
تضمين
[classA][Arrow][ClassB]
UML为类定义了八种不同类型的关系:
| النوع | الوصف |
|---|---|
| <|-- | وراثة |
| *-- | تركيب |
| o-- | تجميع |
| --> | ارتباط |
| -- | رابط (ممتلئ) |
| ..> | تبعية |
| ..|> | تحقيق |
| .. | رابط (متقطّع) |
نسخ
تضمين
classDiagram
classA <|-- classB
classC *-- classD
classE o-- classF
classG <-- classH
classI -- classJ
classK <.. classL
classM <|.. classN
classO .. classP
يمكننا استخدام التسميات لوصف طبيعة العلاقة بين فئتين. بالإضافة إلى ذلك، يمكن استخدام الأسهم بالاتجاه المعاكس أيضًا:
نسخ
تضمين
classDiagram
classA --|> classB : Inheritance
classC --* classD : Composition
classE --o classF : Aggregation
classG --> classH : Association
classI -- classJ : Link(Solid)
classK ..> classL : Dependency
classM ..|> classN : Realization
classO .. classP : Link(Dashed)
تسمية العلاقة
يمكن إضافة نص تسمية إلى العلاقة:
نسخ
تضمين
[classA][Arrow][ClassB]:LabelText
نسخ
تضمين
classDiagram
classA <|-- classB : implements
classC *-- classD : composition
classE o-- classF : aggregation
علاقة ثنائية الاتجاه
يمكن أن تمثّل العلاقة ثنائية الاتجاه منطقيًا ارتباط N:M:
نسخ
تضمين
classDiagram
Animal <|--|> Zebra
语法如下:
نسخ
تضمين
[Relation Type][Link][Relation Type]
其中 Relation Type 是以下之一:
| النوع | الوصف |
|---|---|
| <| | وراثة |
| * | تركيب |
| o | تجميع |
| > | ارتباط |
| < | ارتباط |
| |> | تحقيق |
Link واحد مما يلي:
| النوع | الوصف |
|---|---|
| -- | خط متصل |
| .. | خط متقطّع |
واجهة المصاصة
يمكن أيضًا إسناد نوع علاقة خاص إلى الفئة، وهو يعرّف واجهة مصاصة للفئة. وتُعرَّف واجهة المصاصة بالصيغة التالية:
- bar ()-- foo
- foo --() bar
الواجهة ذات المصاصة (bar) تتصل بالفئة (foo).
ملاحظة: كل واجهة معرَّفة فريدة، والهدف ألّا تُشارَك بين الفئات وألّا يُسمح بتوجيه روابط متعددة إليها.
نسخ
تضمين
classDiagram
bar ()-- foo
نسخ
تضمين
classDiagram
class Class01 {
int amount
draw()
}
Class01 --() bar
Class02 --() bar
foo ()-- Class01
تعريف مساحة الأسماء
تجمّع مساحة الأسماء الفئات.
نسخ
تضمين
classDiagram
namespace BaseShapes {
class Triangle
class Rectangle {
double width
double height
}
}
أساس/تعددية العلاقة
تشير التعددية أو الأساس في مخطط الفئات إلى عدد مثيلات فئة يمكن ربطها بمثيلات فئة أخرى. على سبيل المثال، لكل شركة موظف واحد أو أكثر، ولا يمكن أن يكون صفرًا، بينما يعمل كل موظف حاليًا في صفر شركة أو شركة واحدة.
تُوضع رموز التعددية قرب نهاية الارتباط.
خيارات الأساس المختلفة هي:
- 1 واحد فقط
- 0..1 صفر أو واحد
- 1..* واحد أو أكثر
- * صفر أو واحد أو أكثر
- n n (حيث n>1)
- 0..n صفر إلى n (حيث n>1)
- 1..n واحد إلى n (حيث n>1)
يمكن تعريف الأساس بسهولة بإحاطة الخيارات النصية بعلامتي اقتباس مزدوجتين قبل السهم المعطى أو بعده. على سبيل المثال:
نسخ
تضمين
[classA] "cardinality1" [Arrow] "cardinality2" [ClassB]:LabelText
نسخ
تضمين
classDiagram
Customer "1" --> "*" Ticket
Student "1" --> "1..*" Course
Galaxy --> "many" Star : Contains
تعليق الفئة
يمكن تعليق الفئة بعلامات لتوفير بيانات وصفية إضافية عنها. وهذا يوضّح طبيعة الفئة أكثر. وتشمل بعض التعليقات الشائعة:
- <<Interface>> يمثّل فئة واجهة
- <<Abstract>> يمثّل فئة مجرّدة
- <<Service>> يمثّل فئة خدمة
- <<Enumeration>> يمثّل تعدادًا
تُعرَّف التعليقات في << في البداية و >> في النهاية. وهناك ثلاث طرق لإضافة تعليقات إلى الفئة، والناتج واحد في الطرق الثلاث:
- ضمن تعريف الفئة
نسخ
تضمين
classDiagram
class Shape <<interface>>
في سطر مستقل بعد تعريف الفئة:
نسخ
تضمين
classDiagram
class Shape
<<interface>> Shape
Shape : noOfVertices
Shape : draw()
- في البنية المتداخلة لتعريف الفئة:
نسخ
تضمين
classDiagram
class Shape{
<<interface>>
noOfVertices
draw()
}
class Color{
<<enumeration>>
RED
BLUE
GREEN
WHITE
BLACK
}
تعليق
يمكنك إدخال تعليقات في مخطط الفئات، وسيتجاهلها المحرّر. يجب أن يشغل التعليق سطرًا مستقلًا، ويجب أن يبدأ بعلامتي النسبة المئوية المزدوجة (%%). ويُعدّ كل النص حتى السطر التالي تعليقًا، بما في ذلك أي صيغة لمخطط الفئات.
نسخ
تضمين
classDiagram
%% This whole line is a comment classDiagram class Shape <<interface>>
class Shape{
<<interface>>
noOfVertices
draw()
}
تعيين اتجاه المخطط
يمكنك استخدام عبارة الاتجاه لتعيين اتجاه تصيير مخطط الفئات:
نسخ
تضمين
classDiagram
direction RL
class Student {
-idCard : IdCard
}
class IdCard{
-id : int
-name : string
}
class Bike{
-id : int
-name : string
}
Student "1" --o "1" IdCard : carries
Student "1" --o "1" Bike : rides
تفاعل
يمكن ربط حدث النقر بالعقد. ويمكن لحدث النقر أن يشغّل دالة رد نداء JavaScript، أو أن يفتح رابطًا سيُحمَّل في تبويب متصفّح جديد. ملاحظة: تُعطَّل هذه الميزة عند استخدام securityLevel='strict'، وتُفعَّل عند استخدام securityLevel='loose'.
يمكنك تعريف هذه العمليات في سطر مستقل بعد جميع إعلانات الفئات.
نسخ
تضمين
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
- action هو link أو callback، وفق نوع التفاعل الذي تريد استدعاءه.
- className هو معرّف id العقدة المرتبط بالعملية.
- reference يمكن أن يكون رابط URL أو اسم دالة رد النداء.
- (اختياري) التلميح هو سلسلة نصية تُعرض عند مرور مؤشر الفأرة فوق العنصر.
- ستُستدعى دالة رد النداء بحيث يكون nodeId هو المعامل.
ملاحظة
يمكن استخدام note "line1 line2" لإضافة تعليق على المخطط. ويمكن استخدام note for <CLASS NAME> "line1 line2" لإضافة تعليق لفئة معيّنة.
مثال
نسخ
تضمين
classDiagram
note "This is a general note"
note for MyClass "This is a note for a class"
class MyClass{
}
رابط URL:
نسخ
تضمين
classDiagram
class Shape
link Shape "https://www.github.com" "This is a tooltip for a link"
class Shape2
click Shape2 href "https://www.github.com" "This is a tooltip for a link"
التكوين
مربع الأعضاء
يمكن إخفاء مربع الأعضاء الفارغ لعقدة الفئة، ويتم ذلك بتغيير قيمة hideEmptyMembersBox في تكوين مخطط الفئات.
نسخ
تضمين
---
config:
class:
hideEmptyMembersBox: true
---
classDiagram
class Duck