今回の記事では、UMLにおけるクラス図の描き方をまとめました。
クラス図の見方を知りたい!
細かい表現はどうすればいいんだろう…
という方へ向けて、
- クラス図とは
- クラス図の描き方
- 細かな表現方法
について解説致します! この記事を読んでいただければ、クラス図の基本的をおさえる事ができ、描くことが可能になると思います。ぜひ、最後までお付き合いください!
クラス図とは
まずはじめに、クラス図の概要を説明致します。クラス図は一言で表すと、システムの静的な構造・関係性を表現する為の図です。クラスはオブジェクトの型を表現したものです。
それぞれのクラスではデータや処理の情報などが表現されており、さらにそのクラス同士の関係性がクラス図では表現されています。実際の図を見てみましょう。
こちらがクラス図の一例です。以降では、クラス図を描くうえで必要な要素をそれぞれ説明していきます。
クラス図の描き方(基本)
それでは早速、クラス図の基本に入りましょう。クラス図において基本になるのはクラスです。ここでは、クラスの描き方を説明致します。例として以下の図を用意しました。
社員というクラスですね。それぞれの要素を確認しましょう。
1.可視性
1の箇所、この例では「-」となっている箇所にあたりますが、こちらは可視性を表しています。可視性とは、この後に出てくる「属性」や「操作」に対してアクセスが可能となる範囲を表現するものです。可視性には以下の4種類があります。
記号 | 意味 |
---|---|
+ | すべてのクラスからアクセスが可能 |
ー | 自クラスからのみアクセスが可能 |
# | 自クラスおよび継承されているクラスからのみアクセスが可能 |
~ | 同一パッケージ内のクラスからのみアクセスが可能 |
1.属性名
1の箇所は「属性名」です。属性は、そのクラスが持つ要素を意味しています。今回の「社員」というクラスには、「社員名(名前)」だったり、「社員番号」、「入社日」といった社員に関する属性が入ります。
2.型
2の箇所には、「型」が入ります。型といってもクラスで言う型ではなく、その属性が文字列で表されるか、数値で表すかといった、属性を表現する型が入ります。プログラミングにおいては、intかstringかといった具合ですね。
2の属性は社員番号となるので、文字列型ではなく数値型などにしても問題はありません。
3.初期値
3の箇所には、「初期値」が入っています。こちらは読んで字の通り、最初にあらかじめ入れておく値(デフォルト値)になります。以上の1~3を1行で、
「属性名:型=初期値」というように記述します。
4.操作名
続いて、クラスの下半分の領域に入ります。4では、そのクラスで行う事のできる「操作」を表現します。プログラミングで言う、関数ですね。
「操作名(引数:引数の型)」と表します。
5.戻り値
最後に5は操作の「戻り値」です。戻り値を返さない場合はvoidとします。操作名と合わせて、
「操作名():戻り値」と表します。
クラス図の細かな表現について
関連
クラスが複数あり、それらに何かしらの関係があるときは、「関連」として表現します。
例えば、
- AのクラスがBのクラスの操作を呼び出す関連
- AのクラスがBのクラスのデータを属性として保持している関連
などがあります。関連を表現するには、AとBのクラスを線で結び、そこに関連名を付与します。
上記の例では、「所属」が関連名となります。
多重度
関連のあるクラス間において、クラスAから見たクラスBの存在しうる数を表したものが「多重度」です。
例としては、以下のようになります。
この図から分かるのは、
- 1つの部署から見て、社員は1人以上いること
- 1人の社員から見て、所属する部署は1つである事
が分かります。多重度の数字の意味は以下のようになります。
表記 | 意味 |
---|---|
n | 値の通り |
"0..n" または "*" | 0以上 |
"1..*" | 1以上 |
"m..n" | mからnまで |
誘導可能性
関連のあるクラス同士のやりとりが、単方向からのみである場合、その方向性を明確に表す事ができ、「誘導可能性」として表現する事ができます。実際の例で見てみましょう。
このように、矢印とバツで表現する事が可能です。
汎化(継承)
「汎化」はいわゆる継承です。クラスAの型を継承し、具体化したクラスBがあるとき、AとBの関係性は「汎化」と言えます。このとき、クラスAを「スーパークラス」と言い、クラスBを「サブクラス」と言います。UMLで描画すると、以下のようになります。
集約
関連のあるクラス同士が、「全体」と「部分」の関係にあるとき、「集約」として表現します。具体的な例を挙げると、「部署」と「社員」といった関係が「全体」と「部分」にあたります。実際に集約を図で表すと、以下のようになります。
コンポジット
コンポジットは、集約の一種になります。コンポジットは「全体」インスタンスが「部分」インスタンスの生成や削除を担っている場合に使用されます。
また、全体インスタンスが削除されると、基本的には、連鎖して部分インスタンスも削除される関係になります。UMLでコンポジットは菱形部分が黒くなります。
依存
「依存」は、クラス間で関係性はあるが、あまり強くない関係性の場合に使います。実際の例で見てみると分かりやすいかと思います。
ここで依存関係となっているのは、「会社」と「社員」クラスです。会社は「雇用する」操作によって社員クラスを生成しますが、その後操作を行わない一時的な関係性です。このような強くない関係性の場合、依存を活用します。
インタフェース
「インタフェース」は、クラスが実現するうえで必要な共通操作のみを定義したクラスを言います。ルールとしてインタフェースには操作の具体的な処理は記載せず、具体的な処理は「サブクラス」で定義します。
このインタフェースとサブクラスの関係を「実現」と言います。なお、実現は汎化の一種です。例として、車をインタフェースとしてみると、「乗用車」、「バス」、「トラック」などがサブクラスになります。UMLでこれを表現すると、以下のようになります。
矢印まとめ表
ここまで、沢山の矢印が出ましたね! ややこしくなってしまっていると思いますので、表にまとめました。それぞれの意味さえ分かっていれば、この表だけで十分になることかと思います。是非活用してください!
矢印の種類 | 意味 |
---|---|
関連 | |
誘導可能性 | |
汎化 | |
集約 | |
コンポジット | |
依存 | |
実現 |
まとめ
いかがでしたでしょうか? 今回の記事では、
- クラス図とは
- クラス図の描き方
- 細かな表現方法
について解説致しました。今回解説した内容が分かれば、基本的なクラス図は問題無く描くことが出来ます!是非ここで覚えて、活用してください。