PlantUML Example for RDRA 2.0 ハンドブック

[RDRA（Relationship Driven Requirement Analysis）](http://k-method.jp/) はモデルベースの要件定義の手法です。
RDRA 2.0 では要件定義をもっと軽く利用できるようにいくつかの手法が拡張されています。

[RDRA2.0 ハンドブック](https://www.amazon.co.jp/gp/product/B07STQZFBX) のサンプルを [PlantUML](http://plantuml.com/) と Markdown のテキストを使って記述する方法を紹介します。

# RDRA 2.0

従来の RDRA から RDRA2.0 では大きく 3 つの変更があります。

1. ダイアグラムのシンプル化
1. 業務フロー、利用シーンを洗い出す方法の明示
1. ビジネスルールの記述方法の明示

「参考: `RDRA2.0 ハンドブック` の `1: RDRA2.0 とは` より」

あまり使われなかったダイアグラムが整理されて、ビジネスユースケースモデルへの拡張があり、また、**アイコンの形を規定しない** や **アイコン間の関連線に方向はつけない** の変更により PlantUML で表現がやりやすくなりました。

# サンプル: 図書管理システム

`RDRA2.0 ハンドブック` の `10章:サンプル:図書管理システム` から同じ内容でダイヤグラムをいくつか書きます。
(`10.1.` や `10.2.` ... は RDRA2.0 ハンドブックの見出しと合わせています。)

## 10.1. ビジネスコンテキスト図

ビジネスルールに関わるビジネス要素を表現します。

- PlantUML の [ユースケース図](https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48#use-case) をベースに利用します。
- アクターは `actor`、 業務は `( )`、実態は `entity` に記述します。
- ビジネス要素の会社は `node`、組織は `rectangle` や `agent` に記述します。
- 概要などの文章は Markdown の `list(-)` に記述します。

---

### 図書館システム: ビジネスコンテキスト

- 本の貸出、返却と蔵書の管理をシステム対象の業務スコープとする
  - 会員の登録と貸出図書の管理を行う「会員管理」
  - 会員登録した会員に対して蔵書の貸出・返却を行う「貸出・返却」
  - 蔵書の補充と棚卸を行う「蔵書管理」

```plantuml
left to right direction

actor 会員
node 書籍店
node 図書館 {
  entity 蔵書
  entity 書架
  rectangle 窓口 {
    actor 図書館員
  }
  rectangle 司書室 {
    actor 司書
  }

  会員 .. (会員管理)
  (会員管理) .. 図書館員

  会員 .. (貸出返却)
  (貸出返却) .. 図書館員
  (貸出返却) .. 蔵書
  (貸出返却) .. 書架

  蔵書 .. (蔵書整理)
  書架 .. (蔵書整理)
  (蔵書整理) . 司書
  (蔵書整理) .. 書籍店
}
```

```
left to right direction

actor 会員
node 書籍店
node 図書館 {
  entity 蔵書
  entity 書架
  rectangle 窓口 {
    actor 図書館員
  }
  rectangle 司書室 {
    actor 司書
  }

  会員 .. (会員管理)
  (会員管理) .. 図書館員

  会員 .. (貸出返却)
  (貸出返却) .. 図書館員
  (貸出返却) .. 蔵書
  (貸出返却) .. 書架

  蔵書 .. (蔵書整理)
  書架 .. (蔵書整理)
  (蔵書整理) . 司書
  (蔵書整理) .. 書籍店
}
```

## 10.2. システムコンテキスト図

システムに関わる人や外部システムを表現します。

- PlantUML の[ユースケース図](https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48#use-case) をベースに利用します。
- アクターは `actor`、システム は `( )`、 外部システムは `agent` に記述します。
- **システム化の目的** は Markdown の `h4(####)` に記述します。

---

### 図書館システム: システムコンテキスト

- 本の貸出、返却と蔵書の管理をシステム対象の業務スコープとする

#### システム化の目的

- 図書館員の作業（書籍購買の自動連係）を支援し、本の貸出・返却業務において会員を待たせないスムーズな運用を実現する
- 蔵書管理をリアルタイムで行い検索、在庫など会員サービスを向上させる

```plantuml
left to right direction

actor 会員
actor 図書館員
agent 書籍通販会社

会員 -- (図書館システム)
図書館員 -- (図書館システム)
note right : システム化の目的

(図書館システム) -- 書籍通販会社
```

```
left to right direction

actor 会員
actor 図書館員
agent 書籍通販会社

会員 -- (図書館システム)
図書館員 -- (図書館システム)
note right : システム化の目的

(図書館システム) -- 書籍通販会社
```

## 10.3. 要求モデル図

アクターの要望と、粒度の揃った要件を表現します。(ステークホルダーの要求を表現)

- PlantUML の [ノート](https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48#note) をベースに利用します。
- 要望をアクターのノート(`note right :`) に記述します。
- 要件は Markdown の `h4(####)` に記述します。

---

### 要件モデル

#### 要望

```plantuml
left to right direction

actor 司書
actor 図書館員
actor 会員

actor 会員
note right : 見たい本が図書館にあるかをWebで検索したい
actor 会員
note right : 借りたい本をWebで予約したい

actor 図書館員
note right : 本の貸出、返却手続きを簡素化したい
actor 図書館員
note right : 本の在庫をリアルタイムで把握したい

actor 司書
note right : 本の購入を簡素化したい
actor 司書
note right : 返却率が悪くならないように返却を簡単にする
```

```
left to right direction

actor 司書
actor 図書館員
actor 会員

actor 会員
note right : 見たい本が図書館にあるかをWebで検索したい
actor 会員
note right : 借りたい本をWebで予約したい

actor 図書館員
note right : 本の貸出、返却手続きを簡素化したい
actor 図書館員
note right : 本の在庫をリアルタイムで把握したい

actor 司書
note right : 本の購入を簡素化したい
actor 司書
note right : 返却率が悪くならないように返却を簡単にする
```

#### 要件

- Web で借りたい本を検索でき、そのまま予約できること
- 本の貸出と返却を簡易に行え、リアルタイムで在庫に反映できること
- 本の購入を Web で直接行え、購入した本の情報をそのままシステムに取り込めること

## 10.4. ビジネスユースケース図 会員管理

業務を構成する価値を提供する単位で表現します。

- システムコンテキスト図 と同じです。

---

### 会員管理: 業務

- 会員の登録、会員に貸出している図書の期限管理を行う
  - 新規会員の登録とカード発行を行う「会員登録」
  - 貸出中の蔵書の期限管理を行う「貸出図書の期限管理」

```plantuml
left to right direction

actor 会員
agent 窓口

会員 -- (会員登録)
(会員登録) -- 窓口

会員 -- (期限管理)
(期限管理) -- 窓口
```

```
left to right direction

actor 会員
agent 窓口

会員 -- (会員登録)
(会員登録) -- 窓口

会員 -- (期限管理)
(期限管理) -- 窓口
```

## 10.6. ビジネスユースケース図 蔵書管理

業務を構成する価値を提供する単位で表現します。

- ビジネスコンテキスト図 と同じです。

---

### 蔵書管理: 業務

- 蔵書の棚卸と新規図書の購入、書籍補充を行う
  - 書架の本と貸出図書を合わせて本の在庫を確認する「棚卸」
  - 既存の本の補充、新規書籍の購入を行う「書籍補充」

```plantuml
left to right direction

actor 会員
entity 蔵書
agent 窓口
node 書籍店

会員 -- (棚卸)
(棚卸) -- 蔵書
(棚卸) --- 窓口

会員 -- (書籍補充)
(書籍補充) -- 蔵書
(書籍補充) --- 窓口
(書籍補充) -- 書籍店
```

```
left to right direction

actor 会員
entity 蔵書
agent 窓口
node 書籍店

会員 -- (棚卸)
(棚卸) -- 蔵書
(棚卸) --- 窓口

会員 -- (書籍補充)
(書籍補充) -- 蔵書
(書籍補充) --- 窓口
(書籍補充) -- 書籍店
```

## 10.7. 情報モデル

システムで扱うビジネスを駆動するための用語を構造化で表現します。

- PlantUML の [オブジェクト図](https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48#object) をベースに利用します。
- 情報は `object` で表現します。また、`entity` や `class` も利用することができます。

---

### 情報モデル

- 本を中心に貸し出した本を表す「貸出図書」、書架にある本の在庫である「蔵書」、本の補充に対応する「書籍発注」からできている

```plantuml
left to right direction

object 会員
object 本

object 貸出予約
object 貸出図書

object 蔵書
object 書架

object 書籍発注

会員..貸出予約
貸出予約..本

会員..貸出図書
貸出図書..本

本.蔵書
蔵書.書架

本..書籍発注
```

```
left to right direction

object 会員
object 本

object 貸出予約
object 貸出図書

object 蔵書
object 書架

object 書籍発注

会員..貸出予約
貸出予約..本

会員..貸出図書
貸出図書..本

本.蔵書
蔵書.書架

本..書籍発注
```

## 10.8. 状態モデル

ビジネスで使われてる用語で状態を表しているものを構造化で表現します。

- - PlantUML の [ステートマシン図](https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48#state) をベースに利用します。
- 状態を矢印の左右で表現し、ユースケースをコメント(`:`)に記述します。

---

### 状態モデル

- 蔵書の貸し出しから返却までと Web 予約から貸し出しまでの２つの状態を管理する

#### 蔵書の状態

```plantuml
left to right direction

[*] --> 在庫中
在庫中 -> [*]

在庫中 --> 貸出中: (蔵書の貸出を登録する)
貸出中 --> 在庫中: (貸出図書の返却を登録する)

state 貸出中 {
  [*] ->  期限内
  期限内 -> 期限切れ: (貸出期限を確認する)

  note right of 期限内: [貸出期限＞＝今日]
  note right of 期限切れ: [貸出期限＜今日]
}
```

```
left to right direction

[*] --> 在庫中
在庫中 -> [*]

在庫中 --> 貸出中: (蔵書の貸出を登録する)
貸出中 --> 在庫中: (貸出図書の返却を登録する)

state 貸出中 {
  [*] ->  期限内
  期限内 -> 期限切れ: (貸出期限を確認する)

  note right of 期限内: [貸出期限＞＝今日]
  note right of 期限切れ: [貸出期限＜今日]
}
```

#### Web 予約の状態

```plantuml
left to right direction

[*] --> 未予約
未予約 -> [*]

未予約 --> 予約中: (貸出本の予約をする)
予約中 --> 未予約: (貸出本の取消をする)

state 予約中 {
  [*] ->  未準備
  未準備 --> 準備完了: (予約図書を取り置く)

  準備完了-> 準備完了: (取置期限を確認する)
  note bottom of 準備完了: [取置期限＞＝今日]
}

予約中 --> 未予約: (取置図書を消し込む)
note bottom of 予約中: [取置期限＜今日]
```

```
left to right direction

[*] --> 未予約
未予約 -> [*]

未予約 --> 予約中: (貸出本の予約をする)
予約中 --> 未予約: (貸出本の取消をする)

state 予約中 {
  [*] ->  未準備
  未準備 --> 準備完了: (予約図書を取り置く)

  準備完了-> 準備完了: (取置期限を確認する)
  note bottom of 準備完了: [取置期限＞＝今日]
}

予約中 --> 未予約: (取置図書を消し込む)
note bottom of 予約中: [取置期限＜今日]
```

## 10.9. バリエーション・条件図

バリエーションを表を集めて表現します。

- バリエーションと条件は Markdown の `table(| --- |)` に記述します。
- 条件にバリエーションのタイトルを `\` の左右に記述します。
- PlantUML なら単純な [アクティビティの条件文]() が利用できそうです。

---

### バリエーション

- 本の種類と会員の内訳をバリエーションで示し、貸出期限や取り置き期限、貸出制限を条件として、ビジネスルールを表現

#### バリエーション

| 会員種別 |
| -------- |
| 大人     |
| 子供     |

| 遅延日数       |
| -------------- |
| 遅延日数＜３日 |
| 遅延日数＜７日 |
| 上記以外       |

#### 条件

##### 貸出期限

- 貸出期限: 貸出日＋１４日

| 遅延日数 \ 会員種別 | 大人             | 子供             |
| ------------------- | ---------------- | ---------------- |
| 遅延日数＜３日      | １人５冊まで     | １人７冊まで     |
| 遅延日数＜７日      | 本の貸し出し不可 | １人４冊まで     |
| 上記以外            | 本の貸し出し不可 | 本の貸し出し不可 |

###### 大人

```plantuml
:貸出期限;
if (遅延日数＜３日) then (yes)
  :１人５冊まで;
elseif (遅延日数＜７日) then (yes)
  :本の貸し出し不可;
else (no)
  :本の貸し出し不可;
endif
```

```
:貸出期限;
if (遅延日数＜３日) then (yes)
  :１人５冊まで;
elseif (遅延日数＜７日) then (yes)
  :本の貸し出し不可;
else (no)
  :本の貸し出し不可;
endif
```

###### 子供

```plantuml
:貸出期限;
if (遅延日数＜３日) then (yes)
  :１人７冊まで;
elseif (遅延日数＜７日) then (yes)
  :遅延日数＜７日;
else (no)
  :本の貸し出し不可;
endif
```

```
:貸出期限;
if (遅延日数＜３日) then (yes)
  :１人７冊まで;
elseif (遅延日数＜７日) then (yes)
  :遅延日数＜７日;
else (no)
  :本の貸し出し不可;
endif
```

# Tips

## Edit

- Visual Studio Code は [Markdown Preview Enhanced](https://shd101wyy.github.io/markdown-preview-enhanced/) を利用すると Markdown と PlantUML を同時に編集しながらプレビューで確認することができます。
- [GitLab](https://docs.gitlab.com/ee/administration/integration/plantuml.html) も Markdown と PlantUML に対応しており、テキストがマークアップされるのでドキュメントとして有効です。
- [Qiita:Team](https://qiita.com/ogomr/items/37954cde0226c984ae36) も GitLab と同様です。