תרשים מחלקות
תרשים מחלקות הוא אבן הבנייה העיקרית של מידול מונחה עצמים. הוא משמש למידול מושגי כללי של מבנה היישום, וכן למידול מפורט של המרת המודל לקוד תוכנה. תרשים מחלקות יכול לשמש גם למידול נתונים. המחלקות בתרשים מחלקות מייצגות הן את הרכיבים העיקריים והאינטראקציות ביישום, והן את המחלקות שיש לתכנת.
העתק
הטמעה
---
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 מבחינה בין תכונות לבין פונקציות או מתודות על פי קיומם של סוגריים (). פריטים עם () נחשבים כפונקציה או מתודה, וכל השאר נחשבים כתכונות.
קיימות שתי דרכים להגדיר חברי מחלקה; לא משנה איזה תחביר משמש להגדרת החברים, התוצאה זהה. שתי הדרכים השונות הן:
1. שימוש בנקודתיים (:) ואחריהן שם החבר כדי לשייך חבר למחלקה, שימושי להגדרת חבר בודד בכל פעם. לדוגמה:
העתק
הטמעה
classDiagram
class BankAccount
BankAccount : +String owner
BankAccount : +BigDecimal balance
BankAccount : +deposit(amount)
BankAccount : +withdrawal(amount)
2. שימוש בסוגריים מסולסלים {} כדי לשייך חברים למחלקה, כאשר החברים מקובצים בתוך הסוגריים המסולסלים. מתאים להגדרת מספר חברים בבת אחת. לדוגמה:
העתק
הטמעה
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 בדיוק 1
- 0..1 0 או 1
- 1..* 1 ומעלה
- * 0, 1 או יותר
- n n (כאשר n>1)
- 0..n 0 עד n (כאשר n>1)
- 1..n 1 עד 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>> מייצג מונה (enum)
ההערות מוגדרות ב-<< שבהתחלה וב->> שבסוף. קיימות שלוש דרכים להוסיף הערות למחלקה, והפלט של שלוש הדרכים זהה:
- באופן מוטבע בהגדרת המחלקה
העתק
הטמעה
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
אינטראקציה
ניתן לקשור אירועי לחיצה לצמתים. אירוע לחיצה יכול להפעיל פונקציית callback של JavaScript, או לפתוח קישור שייטען בכרטיסייה חדשה בדפדפן. שים לב: תכונה זו מושבתת בעת שימוש ב-securityLevel='strict', ומופעלת בעת שימוש ב-securityLevel='loose'.
ניתן להגדיר פעולות אלו בשורה נפרדת לאחר כל הצהרות המחלקות.
העתק
הטמעה
action className "reference" "tooltip"
click className call callback() "tooltip"
click className href "url" "tooltip"
- action הוא link או callback, בהתאם לסוג האינטראקציה שברצונך להפעיל.
- className הוא מזהה הצומת המשויך לפעולה.
- reference יכול להיות קישור URL, או שם של פונקציית callback.
- (אופציונלי) תיאור העזרה (tooltip) הוא מחרוזת המוצגת כאשר העכבר מרחף מעל הרכיב.
- פונקציית ה-callback תיקרא עם 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{
}
קישור לכתובת אתר:
העתק
הטמעה
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