モデリングの世界に再入門：ユースケース図

# はじめに

UMLの基礎からしっかりと学び直し、プロジェクトで役立つ形にアウトプットしていきたいと考えました。
自分自身の理解を深めるとともに、同じような課題を感じている方々の一助となれば嬉しいです。

UML2.5.1の仕様書を読んだ個人的な見解ですので、おかしなところがあればご容赦ください。

詳しいモチベーションはこちらの記事をご参照ください。

https://qiita.com/tkmsk/items/0ff91acf7397f80ace0b

今回は、ユースケース図に関してまとめていきます。

# ユースケース図

## 概要

ユースケース図は、システムの振る舞い（＝システムがどのような機能を提供するのか）を表すときに使用します。
主に、アクター・ユースケース・システム境界を用いて表します。

## 例：ATM

```plantuml
left to right direction

actor "顧客" as customer
actor "銀行" as bank

rectangle "ATMシステム" {
    usecase withdraw as "引き出し"
    usecase transfer as "送金"
    usecase deposit as "預け入れ"
    usecase register as "ATM登録"
}

customer "1" --> "0...1" withdraw
customer "1" --> "0...1" transfer
customer "1" --> "0...1" deposit
bank "1" --> "0...*" deposit
bank "1" --> "0...*" register
```

このユースケース図は、ある銀行のATMシステムの以下の振る舞いを表しています。

* 顧客は、自身の口座に対して引き出し・預け入れ・送金をすることができる
* 銀行は、ATMの登録・任意の口座への預け入れができる

## 構成要素

### システム境界

```plantuml
left to right direction

skinparam rectangle {
  BorderColor IndianRed
  BorderThickness 2
  FontColor IndianRed
}

actor "顧客" as customer
actor "銀行" as bank

rectangle "ATMシステム" {
    usecase withdraw as "引き出し"
    usecase transfer as "送金"
    usecase deposit as "預け入れ"
    usecase register as "ATM登録"
}

customer "1" --> "0...1" withdraw
customer "1" --> "0...1" transfer
customer "1" --> "0...1" deposit
bank "1" --> "0...*" deposit
bank "1" --> "0...*" register
```

ユースケースは、四角形（上図の赤色）で記述します。
対象とするシステムの内部か外部かをわかりやすくするために使用されます。

### ユースケース

```plantuml
left to right direction

skinparam usecase {
  BorderColor IndianRed
  BorderThickness 2
  BackgroundColor IMPLEMENTATION
}

actor "顧客" as customer
actor "銀行" as bank

rectangle "ATMシステム" {
    usecase withdraw as "引き出し"
    usecase transfer as "送金"
    usecase deposit as "預け入れ"
    usecase register as "ATM登録"
}

customer "1" --> "0...1" withdraw
customer "1" --> "0...1" transfer
customer "1" --> "0...1" deposit
bank "1" --> "0...*" deposit
bank "1" --> "0...*" register
```

ユースケースは、楕円（上図の赤色）で記述します。
システムが提供する一連の振る舞い（＝機能）を表します。
アクターに提供する**有用な機能の単位**であることを意識する必要があります。（細かく書かないように注意が必要です。）

### アクター

```plantuml
left to right direction

skinparam actor {
  BorderColor IndianRed
  BorderThickness 2
  BackgroundColor IMPLEMENTATION
}

actor "顧客" as customer
actor "銀行" as bank

rectangle "ATMシステム" {
    usecase withdraw as "引き出し"
    usecase transfer as "送金"
    usecase deposit as "預け入れ"
    usecase register as "ATM登録"
}

customer "1" --> "0...1" withdraw
customer "1" --> "0...1" transfer
customer "1" --> "0...1" deposit
bank "1" --> "0...*" deposit
bank "1" --> "0...*" register
```

アクターは、一般的には人型（上図の赤色）で記述します。
対象とするシステムの外部からシステムとやり取りするモノを表します。
人だけでなくシステムやデータ等もアクターとして表し、役割毎にアクターとして表します。

### 関係

#### 関連

```plantuml
left to right direction

actor "顧客" as customer
actor "銀行" as bank

rectangle "ATMシステム" {
    usecase withdraw as "引き出し"
    usecase transfer as "送金"
    usecase deposit as "預け入れ"
    usecase register as "ATM登録"
}

customer "1" -[#Red,thickness=2]-> "0...1" withdraw
customer "1" -[#Red,thickness=2]-> "0...1" transfer
customer "1" -[#Red,thickness=2]-> "0...1" deposit
bank "1" -[#Red,thickness=2]-> "0...*" deposit
bank "1" -[#Red,thickness=2]-> "0...*" register
```

関連は、線（上図の赤色）で記述します。
アクターとユースケースに関連があることを表します。
多重度を設定することができます。

#### 拡張

```plantuml
left to right direction

actor customer as "顧客"

rectangle "ATMシステム" {
    usecase withdraw as "引き出し"
    usecase print_receipt as "領収書の発行"
}

customer --> withdraw
print_receipt .[#Red,thickness=2]> withdraw : <<extends>>
```

拡張は、点線（上図の赤色）で記述します。
追加されるユースケースがあるときに使用されます。
1つのユースケースに複数の拡張関係を付与することができ、拡張したユースケースを拡張することも可能です。

#### 包含

```plantuml

left to right direction

actor customer as "顧客"

rectangle "ATMシステム" {
    usecase withdraw as "引き出し"
    usecase transfer as "送金"
    usecase deposit as "預け入れ"
    usecase authenticate as "認証"
}

customer --> withdraw
customer --> transfer
customer --> deposit
withdraw ..[#Red,thickness=2]> authenticate : <<include>>
transfer ..[#Red,thickness=2]> authenticate : <<include>>
deposit ..[#Red,thickness=2]> authenticate : <<include>>
```

包含は、点線（上図の赤色）で記述します。
包含関係は、2つ以上のユースケースから共通の部分があるときに使用されます。
包含されているユースケース（矢印が向いているユースケース）は、それ自体で完全なユースケース（有用な機能）を表してるわけではありません。

# さいごに

今回はユースケース図に関してまとめました。
開発中にあまり使用することはない図ですが、開発初期に認識を揃えるために作ると良いという印象です。

# 参照

https://www.omg.org/index.htm