UML (クラス図)
ちょっとの間離れるとすぐ忘れてしまうので備忘録として。。。
基本的な書き方だけ。
参考
感謝!
書き方
線形 | 関連 | 記号 | 説明 |
---|---|---|---|
関連 | 関連(association) | — | クラス間の関連を表現 |
集約 | 集約(aggregation) | o— | クラス間の関連で全体と一部という関係性を表現 |
コンポジション | コンポジション(composition) | *— | 集約よりも強い集約 |
依存 | 依存(dependency) | <.. | クラス間の依存関係を表現 |
汎化 | 汎化(generalization) | <|— | クラス間の継承を表現 |
実現 | 実現(realization) | <..| | クラス間のインターフェースを表現 |
-
, .
横
--
, ..
縦
---
, ...
縦 (遠距離)
多重度
多重度 | 説明 |
---|---|
1 | 必ず1 |
0..1 | 0 または 1 |
0..* | 0 以上 |
1..* | 1 以上 |
n..m | n以上m以下 ※[例] 1..3 → 1以上3以下 |
n | 必ずn ※[例] 2 → 必ず2 |
n,m | nまたはm。[例] 1,3 → 1または3 |
可視性
記号 | 説明 |
---|---|
- | private |
# | protected |
~ | package private |
+ | public |
Example
関連(association)
基本的なつながり(関連)をあらわします。
以下の例では「社員クラス」と「ユーザクラス」は関連性があり、クラス間の多重度は1対1であることを表現しています
@startuml
employee "1" - "1" user : ラベル
class employee {
- user_id: Integer
- user_name: String
+ get_employee(): Object
}
class user {
- name: String
- address: String
+ get_user(): Object
}
@enduml
集約(aggregation)
「部分クラス」は「全体クラス」の一部であることをあらわします。ただしお互いに依存関係はない。
以下の例では「乗員クラス」は「バスクラス」の一部であること(お互い依存関係はない)、クラス間の多重度は1対0以上であることを表現しています。
@startuml
bus "1" o- "0..n" tire : ラベル
class bus {
- company: string
- number_of_passengers: Integer
}
class tire {
- model: String
- start_data: Date
}
@enduml
コンポジション(composition)
「部分クラス」は「全体クラス」の一部であることをあらわします。集約よりも結びつきが強くお互いが存在して成り立つ関係性。
例えば「全体クラス」が削除されると「部分クラス」もあわせて削除されるような関係性をあらわします。
以下の例では「タイヤクラス」は「バスクラス」の一部であり、「バスが廃車になれば、バスについていたタイヤも廃車になる」といった関係性を表現します。(クラス間の多重度は1対4)
@startuml
bus "1" *- "4" tire : ラベル
class bus {
- company: string
- number_of_passengers: Integer
+ get_bus_info()
}
class tire {
- model: String
- start_data: Date
+ get_bus_info()
}
@enduml
依存(dependency)
お互いが依存関係にあることを表現します。例えば「クラスA」が変更された時、依存関係にある「クラスB」にも変更が生じるといった関係性をあらわします。
以下の例では、「ホイールクラス」と「タイヤクラス」が依存関係となり、「ホイール」を変えると「タイヤ」も変えるといった関係性を表現しています。(クラス間の多重度は1対4)
@startuml
hide empty members
Class GasStation {
}
class Car {
}
GasStation <.. Car : ラベル
@enduml
汎化(generalization)
子クラス」は「親クラス」の性質の継承しているといった関係性をあらわします。
以下の例では「犬クラス」は「動物クラス」の性質を継承していることを表現しています。
@startuml
bus <|- tire : ラベル
class bus {
- company: string
- number_of_passengers: Integer
+ get_bus_info()
}
class tire {
- model: String
- start_data: Date
+ get_bus_info()
}
@enduml
実現(realization)
「抽象クラス(interface)」の振る舞いを具体的に実装した「クラス」であるといった関係性をあらわします。
以下の例では、抽象的なクラスである「動物クラス」の振る舞いを具体的に実装したものが「犬クラス」であるということを表現しています。
@startuml
bus <.. tire
class bus {
- company: string
- number_of_passengers: Integer
+ get_bus_info()
}
class tire {
- model: String
- start_data: Date
+ get_bus_info()
}
note right of tire
注釈
end note
@enduml
Package
@startuml
title パッケージ化
package PackageA {
class ClassA {
}
class ClassB {
}
}
package PackageB {
class ClassC {
}
package PackageC {
class ClassD {
}
class ClassE {
}
}
}
@enduml
Namespaces
@startuml
title 名前空間
namespace PackageA {
class Abc {
}
class Xyz {
}
}
namespace PackageB {
class Abc {
}
namespace PackageC {
class Xyz {
}
}
}
PackageA.Abc ..> PackageA.Xyz
PackageB.Abc ..> PackageB.PackageC.Xyz
@enduml