オブジェクト指向でなぜつくるのか 第8章

## 本について

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186009/7bf8dcaf-d077-9b43-805e-7f6bcad83dc9.png)

Amazon: https://www.amazon.co.jp/dp/4822284654

題材として選択したのは、「オブジェクト指向でなぜつくるのか-第2版-」という本です。13章で構成されており、今回は第8章について、まとめました。

## ゴール
- UML における各ダイアグラムの目的や用途を押さえる

## UML とは
UML は Unified Modeling Language の略です。 Language とは書かれていますが、ソフトウェアの機能や内部構造を表現する「図」の描き方を指します。

また UML は国際的な標準化団体の OMG(Object Management Group) によって標準として採択されています。

オブジェクト指向プログラミングで書いたプログラムの構造を表現するためだけに使われるのではなく、業務分析や要求定義といった上流工程で状況を整理するために使われたり、従来から使われてきたフローチャートや状態遷移図なども取り込んだことで、ソフトウェア開発における図式表現の集大成になっています。

## 13種類のUMLダイアグラム
UML バージョン2では以下の表に示す13種類のダイアグラムを規定しています。

![oop-UMLダイアグラム.png](https://qiita-image-store.s3.amazonaws.com/0/186009/b86b2813-58cc-8ff5-9d74-0edb7d96ecfc.png)

## UMLの使い方
UML は広い適用範囲を想定して多くの種類のダイアグラムを定義していますが、具体的な使い方については何も規定していません。

この本では、UML の使い方を大きく3つに分けており、それぞれの説明を以下にまとめます。

### 1. プログラムの構造や動作を表現
1次元の情報であるプログラムのコードを2次元の図に表現することによって、 **人間がプログラムの構造や動作を理解しやすく、記憶しやすくなります** 。

この目的で使用される代表的な図は「クラス図」、 「シーケンス図」、「コミュニケーション図」の3つのようです。

#### クラス図
クラス図は、クラスを基本単位とするオブジェクト指向プログラミングのプログラム構造を表現します。

例として、ファイルシステムを操作するプログラムの一部を表現するクラス図が紹介されていました。

![oop-クラス図.png](https://qiita-image-store.s3.amazonaws.com/0/186009/d5589aeb-20e9-ff64-0b73-d7fd5f5a7958.png)

この図は以下のことを表現しています。

- File、Directory の2つのクラスは、 Node クラスのサブクラスである。
- File のサブクラスとして、さらに ShortCut クラスがある。
- ShortCut クラスのインスタンスは、 Node クラス（またはそのサブクラス）のインスタンスを1つ保持する。
- Directory クラスのインスタンスは、 Node クラス（またはそのサブクラス）のインスタンスを複数保持できる。

上記の図に対応するソースコードは以下になります。

```java:ソースコード
// Nodeクラス
public abstract class Node {
  private String name;
  protected Node(String name) {
    this.name = name;
  }
  public String getName() {
    return this.name;
  }
  public void setName(String name) {
    this.name = name;
  }
}
// Fileクラス
public class File extends Node {
  public File(String name) {
    super(name);
  }
}
//ShortCutクラス
public class ShortCut extends File {
  private Node linkedNode;
  public ShortCut(Node node, String name) {
    supre(name);
    this.linkedNode = node;
  }
  public ShortCut(Node node) {
    super("Short Cut to " + node.getName());
  }
  public Node getLinkedNode() {
    return this.linkedNode;
  }
}
//Directoryクラス
public class Directory extends Node {
  private java.util.List children;
  public Directory(String name) {
    super(name);
    this.children = new java.util.ArrayList();
  }
  public void add(Node node) {
    this.children.add(node);
  }
  public java.util.Iterator getChildren() {
    return this.children.iterator();
  }
  public java.util.Iterator getDescendants() {
//〜以下、省略〜//
```

UML を使ったことで情報量が少なくなり、全体像を理解しやすくなることがわかるかと思います。

またイメージで記憶することができるようになるため、「File クラスと Directory クラスの上にスーパークラスが描かれていたけど、なんというクラスだったっけ？」というように、イメージの位置関係と合わせて内容を記憶しやすくなるという効果もあります。

さらに記憶力の良い方であれば、第6章でも紹介されていたデザインパターンの Composite パターンの位置関係と類似していることに気づいたかもしれません。このようにデザインパターンに気付きやすくなることで、設計の意図も汲み取ることができるようになります。

#### シーケンス図
シーケンス図は、プログラムのメソッドの呼び出しを時系列に表現します。

オブジェクト指向プログラミングにおけるメソッドは対象とするインスタンスを指定して呼び出すので、インスタンス同士の相互作用を表現することになります。

![oop-シーケンス図.png](https://qiita-image-store.s3.amazonaws.com/0/186009/e50c4429-4c32-662d-d30b-12802ef6dc48.png)

縦軸は時間の経過を表現し、長方形にはインスタンスの名前が書かれています。横向きの矢印はメソッド呼び出しを表現し、矢印の上には呼び出すメソッドの名前と引数を書きます。

#### コミュニケーション図
コミュニケーション図は基本的にシーケンス図とは違い、インスタンスの関係を中心として表現します。

![oop-コミュニケーション図.png](https://qiita-image-store.s3.amazonaws.com/0/186009/13ac20a7-322f-4571-c48c-9ce579f0f5c4.png)

なお表現している対象はシーケンス図と同じです。

### 2. 汎用の整理術の成果物を表現
集合論と役割分担を表現する汎用の整理術の成果物として使用される UML について説明されていました。

第7章でも説明があったようにオブジェクト指向は上流工程にも応用されたため、 UML が現実世界やコンピュータシステムで管理すべき情報の構造や、役割分担された人や組織が強調しあう様子を表現するためにも使われるようになりました。

ここで紹介されている図は先ほどと同じ、「クラス図」、「シーケンス図」、「コミュニケーション図」ではありますが、プログラム構造を表現する場合とは意味が異なってきます。

#### クラス図
上流工程において使用されるクラス図は、集合論で整理した結果を表現します。

ここでは簡単な例として、書籍を全体集合とし、和書、翻訳書、外国書を部分集合とする例が取り上げられていました。

この例をベン図で表現すると下図のようになります。

![oop-ベン図.png](https://qiita-image-store.s3.amazonaws.com/0/186009/47a22150-71f2-4721-1c6f-21fce2c8c9bb.png)

これをクラス図を使って表現すると下図のようになります。

![oop-クラス図.png](https://qiita-image-store.s3.amazonaws.com/0/186009/aa1a460a-ce14-c6fb-e8fb-fb4afcfa0ca6.png)

クラス図では集合をクラスで表現し、全体集合と部分集合の関係を継承を使って表現します。また、クラスを表現する長方形の下段部分には「属性」が書かれ、クラスの性質が表現されます。

以上を踏まえて考えてみると、上記の図から以下のことが読み取れます。

- タイトル、ISBN、定価はどの書籍（和書、外国書、翻訳書）も持っている
- 外国書にだけ割引価格がある
- 翻訳書にだけ原題がある

ベン図だと全体集合と部分集合の関係を列挙するだけですが、クラス図は全体集合と部分集合の関係に加えて集合に含まれる要素の性質までも簡潔に表現できます。

#### シーケンス図
シーケンス図では「決まった役割を持つ複数の人や組織が協力し合う様子」を時系列に沿って表現することができます。

ここでは患者に対して医師、看護師、薬剤師などが連携し合って仕事をする病院を例にシーケンス図が表現されていました。

![oop-シーケンス図(上流).png](https://qiita-image-store.s3.amazonaws.com/0/186009/00b30514-9ac3-08f9-1cef-9ab21a2eb3ea.png)


矢印は「メッセージ」を表現しているのですが、ここでいうメッセージは現実世界における会話などによる意思伝達を意味します。もちろん図で表現されているメッセージではない方法でやりとりが行われる場合もあります。つまり、上流工程において使用されるシーケンス図はあくまで典型的なパターンを表現しているにすぎません。

しかし、こうした図を作ることで、あいまいな現実世界の仕事の様子が一目瞭然となり、課題改善などが促進されることがあります。

#### コミュニケーション図
コミュニケーション図は基本的にシーケンス図とは違い、役割や組織の関係を中心として表現します。

![oop-コミュニケーション図(上流).png](https://qiita-image-store.s3.amazonaws.com/0/186009/b089d059-5eed-6f19-0837-ceac4ffa20c3.png)


なお表現している対象はシーケンス図と同じです。

### 3. 非オブジェクト指向を表現
オブジェクト指向では表現できない情報を表現する使い方ですが、代表的な図として「ユースケース図」、「アクティビティ図」、「ステートマシン図」が取り上げられています。

#### ユースケース図
ユースケース図は、コンピューターに任せる仕事の範囲を明確に表現するために使われます。

![oop-ユースケース図.png](https://qiita-image-store.s3.amazonaws.com/0/186009/b39c6bf3-934b-18e5-321d-339c1a6f1563.png)

上図がユースケース図の例ですが、大きな長方形がシステムの境界線を表し、その内側にシステムが提供する機能が描かれています。図が単純明快なので、システムの全体像を大まかにつかむために有用な図です。

#### アクティビティ図
アクティビティ図は、オブジェクト指向が登場する以前から使われてきたフローチャートの発展系です。現実世界の業務の流れを表現する目的で使用されます。

![oop-アクティビティ図.png](https://qiita-image-store.s3.amazonaws.com/0/186009/40455243-6911-edee-ad25-ca464771efab.png)

現実世界の仕事の流れは、シーケンス図やコミュニケーション図を使っても表現できますが、実際の仕事の様子を分析するときは全体の流れを直感的に表現できるアクティビティ図を利用します。

#### ステートマシン図
ステートマシン図は、状態遷移図とも呼ばれ、外部からのイベントにより、モノの状態が変化している様子を表現します。

![oop-ステートマシン図.png](https://qiita-image-store.s3.amazonaws.com/0/186009/a49833f8-06e4-b17f-b9d3-d65b6ffe81cd.png)

## まとめ
- UML の各ダイアグラムによって表現できるものが違うため、目的によって使い分けなければならない。
- 使い方を大きく分けると「プログラムの構造や動作」を表現するとき、「汎用の整理術の成果物」を表現するとき、「オブジェクト指向では表現できないもの」を表現するときにわかれる。
- プログラムの構造や動作
    - クラス図は、クラスの定義情報とクラス間の関係を表現する
    - シーケンス図は、実行時のインスタンス間のメソッド呼び出しを次兄れるに表現する
    - コミュニケーション図は、実行時のインスタンス間のメソッド呼び出しをインスタンスの関係を中心に表現する
- 汎用の整理術の成果物
    - クラス部は、集合論で分類・整理した現実世界の物事の関係を表現する
    - シーケンス図は、役割分担された人や組織が協調して全体の仕事を達成する様子を時系列に表現する
    - コミュニケーション図は、役割分担された人や組織が協調して全体の仕事を達成する様子を構造中心に表現する
- オブジェクト指向で表現できないもの
    - ユースケース図は、コンピュータにまかせる仕事の範囲を表現する
    - アクティビティ図は、現実世界の仕事の流れを表現する
    - ステートマシン図は、外部からのイベントによる状態変化を表現する