【新人教育 資料】第3章 UMLまでの道 〜図種類紹介とクラス図の解説編〜

# 【新人教育 資料】第3章 UMLまでの道 〜図種類紹介とクラス図の解説編〜
## あらすじ
新人がいっぱい入ってくる。新人のレベルもバラバラ。教育資料も古くなっているので、更新しましょう。
どうせなら、公開しちゃえばいいじゃん。という流れになり、新人教育用の資料を順次更新していくことにしました。

※後々、リクエストに応じて更新することが多いのでストックしておくことをおすすめします。

自分は[TEMONA株式会社](http://temona.co.jp/)でCTOをしていますが、頭でっかちに理論ばっかり学習するよりは、イメージがなんとなく掴めるように学習し、実践の中で知識を深めていく方が効率的に学習出来ると考えています。

※他の登壇やインタビュー記事は[Wantedly](https://www.wantedly.com/users/105935)から見てください。

教育スタイルとしては正しい事をきっちりかっちり教えるのではなく、未経験レベルの人がなんとなく掴めるように、資料を構成していきます。

以下のようなシリーズネタで進めます。

|No.|記事|
|:-----------|-----------|
|1|[【新人教育 資料】第1章 UMLまでの道 〜オブジェクト指向編〜](http://qiita.com/devopsCoordinator/items/7d460008177b318129ea) |
|2|[【新人教育 資料】第2章 UMLまでの道 〜クラス編〜](http://qiita.com/devopsCoordinator/items/3cde12abce689ff6906b) |
|3|[【新人教育 資料】第3章 UMLまでの道 〜図種類紹介とクラス図の解説編〜](http://qiita.com/devopsCoordinator/items/213e45694dfac0edcfbc) |
|4|[【新人教育 資料】第4章 UMLまでの道 〜クラス図を書いてみよう編〜](http://qiita.com/devopsCoordinator/items/8d2af381c1c469103459) |
|5|[【新人教育 資料】第5章 UMLまでの道 〜ユースケース図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/bbd57df681844308fb5d) |
|6|[【新人教育 資料】第6章 UMLまでの道 〜ステートマシン図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/289f77fc83813ba7cc76)|
|7|[【新人教育 資料】第7章 UMLまでの道 〜アクティビティ図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/e4910ace92e66bece10f)|
|8|[【新人教育 資料】第8章 UMLまでの道 〜シーケンス図の説明&書いてみよう編〜](http://qiita.com/devopsCoordinator/items/4535c3cce207b114ad6c)|

箸休めには以下をどうぞ

[【新人教育 資料】ハードウェア編](http://qiita.com/devopsCoordinator/items/1aa4a76072a61b15c56f)

では、今回もはじめていきましょう！
## UMLとは
統一モデリング言語（Unified Modeling Language）のことである。様々なことをモデリングするために統一されている規格であり、[OMG(http://www.omg.org)](http://www.omg.org)で管理されている。現在は最新版は[UML2.5(http://www.omg.org/spec/UML/2.5/)](http://www.omg.org/spec/UML/2.5/)。本資料は細かいところは説明せず、システム開発時に必要とする、設計、分析や情報共有するのに便利な図（ダイアグラム）を中心に説明すします。最新のUML2.5ではなく、UML2.0の内容をベースに説明します。

### 構造を表現するダイアグラム
|No.|構図 | 概要 |
|:-----------|-----------|:------------|
|1|クラス図|クラスの構造やクラス間の関係、役割を表現|
|2|オブジェクト図|特定下におけるオブジェクト同士の関係を表現|
|3|コンポジット構造図|クラスやコンポーネント等の内部構造と関係を表現|
|4|コンポーネント図|ソフトウェアコンポーネントの構成を表現|
|5|配置図|ハードウェア、ディレクトリなどどうプログラムを配置するかを表現|
|6|パッケージ図|クラスが、どのパッケージにグループ化されているかを表現|
|7|ユースケース図|機能と、利用者や他システムなどの外部との関係を表現|

### 振る舞いを表現するダイアグラム
|No.|振る舞い | 概要 |
|:-----------|-----------|:------------|
|8|シーケンス図|相互作用するオブジェクト間メッセージ送受信を、時間系列で表現|
|9|コミュニケーション図|相互作用するオブジェクト間メッセージ送受信を、オブジェクト間の接続関係に焦点を当てて表現|
|10|タイミング図|リアルタイムのような短時間での状態遷移や時間制約、メッセージ送受信などを表現|
|11|相互作用概要図|相互作用図どうしの関係の概要図。シーケンス図、アクティビティ図等で表現|
|12|ステートマシン図|1つのクラスに着目し、そのオブジェクトの生成から破棄までの状態遷移を表現|
|13|アクティビティ図|システム(や業務)のアクティビティ、データの流れ、アクティビティ実施の条件分岐などを表現|

### 教育時に取り扱うダイアグラム
システム開発において、利用するであろう以下のダイアグラムを説明します。UMLでどの言語でも表現出来るわけではないので、注意が必要ですが、思考する際には便利なのでぜひ学びましょう。

- クラス図
- ユースケース図
- シーケンス図
- アクティビティ図
- ステートマシン図

## クラス図
クラスの構造やクラス間の関係、役割を表現する図です。

1つのクラスを表現するルールとしては
- クラス区画
- 属性区画
- 操作区画
の順に記載しましょう。各区画の間を線で区分けするのがルールです。

![UML 社員というクラス図](https://qiita-image-store.s3.amazonaws.com/0/74153/82dc26e2-c5f8-da0f-8676-6850553a87eb.png "UML 社員というクラス図")

上記の図では
クラス名に「社員」
属性に「社員番号」、「名前」、「性別」
操作に「出社する」、「帰社する」
という表現をしています。

これに関連という表現を追加して見てみましょう。

![UML 社員と会社のクラス図の関連表現](https://qiita-image-store.s3.amazonaws.com/0/74153/5443cf7a-af6a-9027-0439-323ed3fbc1e9.png "UML 社員と会社のクラス図の関連表現")

社員と会社のクラス図が線でつながっているので、何かしらの関連があることが推測出来ますね。これに多重度という表現を追加してみましょう。

### 多重度
#### 例) 社員は１つの会社に所属する場合
社員は１つの会社にしか、所属出来ないとした場合
![UML 社員と会社のクラス図の関連表現に多重度を追加](https://qiita-image-store.s3.amazonaws.com/0/74153/46ab25f7-7261-f475-7379-1f6c7a196926.png "UML 社員と会社のクラス図の関連表現に多重度を追加")

上記のように表現されます。先ほどの関連を示す線の横に"0..*","1"という表記が添えられました。上記の多重度の表現は、「社員」から見た「会社」は1つである。「会社」からみた「社員」は0人以上であるという表現となります。

UMLではない表現方法でER図というものもありますが、そちらだと社員と会社は多対１の関係であると表現されます。会話上では「１対１」、「多対多」、「１対多」などと多重度を示す会話が行われるので合わせて覚えておきましょう。

### 集約 (aggregation)
集約とは関連の表現の１つで、全体と一部という関係を表現する。UMLでは、集約は実線で表し、「全体」側の終端に白抜きの菱形を付ける。
![UML 社員と会社のクラス図の関連表現に集約を追加](https://qiita-image-store.s3.amazonaws.com/0/74153/71926631-d9cf-9ff2-d555-c5e97ed6c0f4.png "UML 社員と会社のクラス図の関連表現に集約を追加")

上記の例では、会社（全体)からみたら社員は一部だと表現されている。全体側に白抜きの菱型着くことを覚えよう。

### 関連名
多重度と集約という表現によって、どのような関連性があるかというのが分かってきました。社員と会社というはっきりしているので、雇用側と非雇用側の関係だろうと推測出来ると思いますが、わかりづらいクラス同士だと多重度や集約だけでは、どのような意味合いで関連性があるのがわかりません。

そのような問題を解決するのに関連名という便利なものがあります。
社員と会社の間に関連名を追加してみましょう。

※ここからは見やすいようにクラス図を縦から横に変えています。

![UML クラス図に関連名を追加した図](https://qiita-image-store.s3.amazonaws.com/0/74153/6d6cd9e0-6087-9378-3b51-0f1a57970f4f.png "UML クラス図に関連名を追加した図")

上記のように関連名は▶を使って表現します。社員は会社で働いているという関連方向性が表現出来ました。関連名は単純にどういう関係かを表現するラベルに過ぎません。

ここからは他のクラスも含めて、他の表現を説明していきます。

## クラス図で使用する他の関連性を示す表現方法
クラス図で関連性を表現出来るものには他にも以下のようなものがあります。

- 汎化 (generalization)
- 実現 (realization)
- 依存 (dependency)
- 集約 (aggregation)
- コンポジション (composition)
- 制約 (Constraint)

よく使うものだけをピックアップして紹介します。

### 汎化 (generalization)
汎化(はんか)とは、クラス間で属性や操作、関連を引き継ぐ事を言います。ちなみに自分は、漢字を間違えていて、ぼんかと読んでいる時期もありました。矢印の向きは、継承先から継承元への方向です。意味合いとしては、継承元は誰に継承されているかは認知していないため、このような向きになっています。

![UML クラス図の汎化(拡張)の例](https://qiita-image-store.s3.amazonaws.com/0/74153/20e76e8a-8e48-f175-15e1-5263499bf6fa.png "UML クラス図の汎化(拡張)の例")

###  コンポジション (composition)
コンポジション (composition)は集約 (aggregation)よりも強い集約を示すものです。具体的には一部が揃っていないと全体側が成り立たない。もしくは全体が消滅したら、一部も一緒に消滅する。というようなものを表現します。UMLでは、集約は実線で表し、「全体」側の終端に黒塗りの菱形を付ける。

![UML クラス図のコンポジションの説明](https://qiita-image-store.s3.amazonaws.com/0/74153/0366907b-2569-d4d5-810d-cd508afa47e1.png "クラス図のコンポジションの説明")

上記の例をみるとわかりますが、ホイールが４つ着いてなかったら、車として成り立たないですよね。

※６輪車、2輪車、3輪車だってあるじゃんって学生みたいな事は言わないでください。

### 依存 (dependency)
UMLのクラス図で使い分けが難しいものNo.1であるが、依存は、あるモデル要素が他のモデル要素を参照としている関係を表している。依存先から依存元へ点線の矢印で表現する。依存元が変更されたら、依存先は変更しなければいけないことを明記する必要がある場合には依存を使用する。

![UML クラス図の依存の説明](https://qiita-image-store.s3.amazonaws.com/0/74153/31aff65b-2c04-c413-460c-5e43038ec48c.png "UML クラス図の依存の説明")

上記の例では、ホイールが変わった場合には、タイヤも依存(その規格に合わせて変更する必要がある)を事を表現している。

### あとがき
今回はUMLの図の種類の紹介と簡単なクラス図の解説を行いました。本来であれば、パッケージや可視性などの話も付け加えるべきかなと思いましたが、その辺の話を付け加えると途端に難しくなってしまうと思ったので、今回は紹介しませんでした。どこかのタイミングでパッケージや可視性の説明も違うポストで行おうと思います。

![UML_Class_sample.png](https://qiita-image-store.s3.amazonaws.com/0/74153/c4a2c577-c06d-7aca-3ed2-3b229fc02d37.png)

次回、以降はユースケース図、シーケンス図、ステートマシン図、アクティビティ図なんかを説明していきます。