【新人教育 資料】第5章 UMLまでの道 〜ユースケース図の説明&書いてみよう編〜

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

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

自分は某社でCTOをしていますが、頭でっかちに理論ばっかり学習するよりは、イメージがなんとなく掴めるように学習し、実践の中で知識を深めていく方が効率的に学習出来ると考えています。

未経験者の教育についてインタビューされた記事もあるので紹介しておきます。ご興味ある方は御覧ください。
[エンジニアは「即戦力」より理念に共感した「未経験者」を育てるほうが費用対効果が高い。](https://tech-camp.in/note/management/6869/)
※他の登壇やインタビュー記事は[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)

では、今回もはじめていきましょう！

## ユースケース図
システムまたはアプリケーションが人、組織、外部システム等と対話するシナリオを示したものです。ユースケース図でこれらの登場人物(システムも含む以降アクターと呼ぶ)が達成する目的やシステムの範囲を示すものです。システムの範囲というのが重要です。
ユースケース図も規模が大きくなってくると複雑になるので、ある特定のシーン(シナリオ)においてという前提をつけて書き出すと綺麗になっていきます。

ユースケース自体を書き始めると粒度が分からなくなってしまう事が多いので、ザクっとした「○○が✕✕する」という英語で習った主語＋動詞というレベルだけに絞って書くなどのルールを決めると分かりやすくなります。

自分なんかは設計するときに口を酸っぱくして言うことの1つに「システムでやらないことを決めろ」といいますが、システムでやらないことを決めるのに、利用するのがユースケース図です。

いや逆でしょってツッコミ受けると思いますが、ユースケースを使って開発をすればするほど、「システムでやらないことを決めるのがユースケース図」だとなんとなくわかってくると思います。

クラス図と同様に細かい表現はいくつかありますが、大まかには以下の3つで構成されると覚えてください。

- アクター
- ユースケース
- 対象

本教育資料上では、ECシステムを例にあげて、ユースケース図を説明していきます。

### アクター
人であろうとシステムであろうと、アクターとして登場人物を表現します。
アクターは、システムを利用する何らかの役割を持つオブジェクトだと考えてください。アクターは人であっても、他システムであってもOKです。ユースケースで記載しようとしているシステムに対し、システムにアクセスするものを役割として表現しましょう。いわゆる棒人間で表現されます。棒人間で表現されますが、人に限定されるわけでなく、他システムなども同じように棒人間で表現されるので、注意しましょう。主語にあたる「○○が」の部分ですね。

```file:plantumlでの表記
actor アクター名
```

![UML ユースケース図 アクター](https://qiita-image-store.s3.amazonaws.com/0/74153/54651063-4133-684f-f4ef-ce6524ca29c6.png "UML ユースケース図 アクター")

### ユースケース
ユースケースは楕円で表現されます。細かい表現はさけて、✕✕するという動詞だけで表現しましょう。△△を✕✕するのように表現が多くなると、どこまで記載すべきかなどがブレるので、初めはシンプルに心がけましょう。

```file:plantumlでの表記
(ユースケース)
```

![UML ユースケース図 ユースケース](https://qiita-image-store.s3.amazonaws.com/0/74153/f8a76462-ca7c-971e-c6ed-7f6d08799afe.png "UML ユースケース図 ユースケース")

ユースケースを書いていくにあたって、アクターが出しきれたか、ユースケースはこれで正しいかと、洗練されてきた後に、「✕✕する」から動詞の目的語を付け加えて「△△を✕✕する」とブラッシュアップしていくことがよいかと思います。

### 対象
対象は、ユースケースを実現する対象を示すものです。長方形で表現れます。システム境界線なども言いますが、どのシステムで実現するのかシステム範囲をしっかり表現するために、システム名称などのラベルを書きましょう。

```file:plantumlでの表記
rectangle 対象名
```

実際には、対象の中にユースケースを含める

```file:plantumlでの表記
rectangle 対象名 {
 アクター名 --> ユースケース
}
```

![UML ユースケース 対象システム](https://qiita-image-store.s3.amazonaws.com/0/74153/7f6b0a66-9b21-1f4d-b86b-c74fe85ca262.png "UML ユースケース 対象システム")

## ECシステムのユースケースの例

### STEP.1 アクターを列挙する
ECシステムのユースケースを考えた場合、どのようなアクターが登場するでしょうか？
シンプルに考えた場合以下の2種類のアクターではないでしょうか？

1. 購入者
2. 管理者

![UML ユースケース 書き方　例 ステップ1 アクターを列挙する](https://qiita-image-store.s3.amazonaws.com/0/74153/dbb6b589-ce75-6d04-5609-bfe1d4da3bc1.png "UML ユースケース 書き方　例 ステップ1 アクターを列挙する")

### STEP.2 アクター毎のユースケースを列挙する
「○○が✕✕する」と英語の文法のS(主語)＋V(動詞)を意識するように簡潔にユースケースを書きましょう。細かい事は一旦省いて書くようにしましょう。

![UML ユースケース 書き方　例 ステップ2 ユースケースを列挙する](https://qiita-image-store.s3.amazonaws.com/0/74153/60b5a349-ab8c-9e0f-1836-998ff6ec2a48.png "UML ユースケース 書き方　例 ステップ2  ユースケースを列挙する")

### STEP.3 対象に収める
アクターとユースケースが列挙出来たら、対象に収めましょう。
アクターごとのユースケースが分かるように、配置なども考えて整えましょう。

![UML ユースケース 書き方　例 ステップ3 対象に収める](https://qiita-image-store.s3.amazonaws.com/0/74153/7e454d40-6592-da2c-e5b4-4fce350d445e.png "UML ユースケース 書き方　例 ステップ3 対象に収める")

### STEP.4 ユースケースを整理する
STEP2.で作ったユースケースの列挙を整理していきます。今まではアクター毎のユースケースを簡潔に、とりあえず列挙したユースケースを、ロジックシンキング等でよくいうMECE（もれなくダブりなくの意）を変更していくことやや、S(主語)＋V(動詞)から「○○が△△を✕✕する」と英語の文法のS(主語)＋V(動詞)+O(目的語)に変更していくこと。また、同じユースケースが他のアクターでも発生するのではないか？等を考えて、反映させていきます。

![UML ユースケース 書き方　例 ステップ4 整理する](https://qiita-image-store.s3.amazonaws.com/0/74153/96d3e756-4ee5-72ee-a119-49bd21efe6a9.png "UML ユースケース 書き方　例 ステップ4 整理する")

ユースケース図の使って、アクター(システムを利用する人やシステム)の定義や、対象のシステムでどのようなユースケースに対応するかなどのシステムの範囲が明記出来ました。

なんとなくイメージはつかめたでしょうか？
ドキュメント文化強い会社などはコレに加えて、以下のユースケース記述という文書を添えます。これはより具体的なシーンとして理解できるように記述を添えるというものです。

- ユースケース記述
 - ユースケース名
 - 概要
 - アクター
 - メインフロー

## プラスα
ユースケースがなんとなく理解出来た人に向けて、さらに表現を広げてみましょう。

### 汎化（Generalization）
クラスの説明の際にした汎化と同じです。先から基へ矢印が向きます。
「is a」関係、つまり、「B is a A」、「BはAといえる」が成り立つものです。
以下の例は「初回購入者 is a 購入者」、「初回購入者は購入者といえる」が成り立つ例です。
ユースケースにおける、汎化の使いドコロとしては、こういうアクターやユースケースも含まれていますよ的に使います。

```file:plantumlでの表記
 アクター名B --|> アクターA
```

![UML ユースケース 書き方 汎化](https://qiita-image-store.s3.amazonaws.com/0/74153/5313f464-e615-3895-3d2c-bc9112c7af28.png "UML ユースケース 書き方 汎化")

### 包含（Include）
ユースケースとして記載しているが、ユースケースは当然、他のユースケースを含むと表現したい時に使います。

「has a」関係、つまり、「A has a B」、「AはBを含む」が成り立つものです。
以下の例は「商品を買うは商品を選ぶを含む」が表現されています。

```file:plantumlでの表記
 (ユースケースA) ..> (ユースケースB) : include
```

![UML ユースケース 書き方 包含 include](https://qiita-image-store.s3.amazonaws.com/0/74153/4af849ab-d1f5-554a-9bfd-f1157dd5d896.png "UML ユースケース 書き方 包含 include")

### 拡張（Extend）
ユースケースとして記載しているが、ユースケースは当然、他のユースケースを含むと表現したい時に使います。

```file:plantumlでの表記
 (ユースケースA) ..> (ユースケースB) : extends
```

![UML ユースケース 書き方 拡張 extend](https://qiita-image-store.s3.amazonaws.com/0/74153/77c06938-e519-a86a-679b-db1ca56a4d2e.png "UML ユースケース 書き方 拡張 extend")

### パッケージ
複数のユースケースをまとめて表現するもしくは、サブシステムにまとめる際に利用するのがパッケージです。

今回の例でとりあげた、ECシステムのユースケースですが、購入者と管理者が同じ「商品を探す」等のユースケースがありますが、購入者が「商品を探す」のと、管理者が「商品を探す」
場合、通常、探す条件やシステムに求める内容が違いますよね？
そんなときにパッケージで表現してみましょう。

```file:plantumlでの表記
 package パッケージ名 {

 }
```

![UML ユースケース 書き方 パッケージ package](https://qiita-image-store.s3.amazonaws.com/0/74153/50e6e762-f94f-2c18-3813-8bbf0e7149f2.png "UML ユースケース 書き方 パッケージ package")

### plantumlでのおまじない
plantumlではdefaultでユースケースが縦になってしまうので横にしましょう。

```file:plantumlでの表記
left to right direction
```
### プラスαを抜いた一連のアニメーション

![UML ユースケース 書き方 サンプル](https://qiita-image-store.s3.amazonaws.com/0/74153/5b6ec1b1-b74a-4e24-7d1e-074372a9ffc3.gif "UML ユースケース 書き方 サンプル")