Java コード設計 プログラミング

【クラス図の矢印】集約、誘導可能性、依存の違い

PC

今回のテーマは「クラス図の矢印の違い」です。

オブジェクト指向型プログラミングの設計でよく使われるクラス図ですが、クラスの関係性を読み取るのは難しいです。

そこで、よく出てくる矢印である集約、誘導可能性、依存の3つの違いを説明していきます。(普通は矢印とは言わず関連と言ったりします。)

このテーマは私が新人研修でつまづいたところです。クラス図はプログラミングをする前に必ず目を通すので理解できないと話になりません。

研修ではあまり詳しく書かれていなかったため、この記事ではわかりやすさと深堀りを重視しています。

3つの違いを一言で

3つの違いを一言で表すと両クラスの関係性です。下図のように矢印によって関係性の強さが変わります。

今は何を言ってるかわからなくても構いません。

それでは、各矢印の意味について具体的に話していきます。

各矢印の説明と具体例

それでは集約>誘導可能性>依存の順に説明していきます。

途中の図で3段構成の図が出てきます。これはクラス名(1段目)、属性(2段目)、メソッド(3段目)を意味します。

集約

集約は全体クラスと部分クラスの関係を表します。

学校と生徒、図書館と本、商店と商品などの全体とそれに含まれる部分要素の関係が成り立つときに使います。

この関係は関係性が強く、全体クラスで部分クラスを属性(メンバ)を宣言します。

属性(メンバ)とはクラス内で静的に宣言する変数を意味します。

例えば、下図のようなケースで使用します。

※オブジェクトの数を表す多重度の記載は省いています。

学校は生徒の一部であることは直感的にわかります。こういった場合は集約の関係になります。

誘導可能性

誘導可能性はクラス内でオブジェクトを生成する関係を表します。

部活と生徒、買い物袋と商品、バッグと本など集約関係ほど強くないが包含関係が成り立つときに使います。

この関係は集約と同じく、一方のクラス内にクラス型の属性(メンバ)を宣言します。

ほぼ集約と同じですが、あくまでも関係性を図にしたときにわかりやすくするためにあると認識しましょう。

例えば、下図のようなケースで使用します。

※オブジェクトの数を表す多重度の記載は省いています。

生徒クラスは部活クラス内でオブジェクトの型として宣言されています。しかし、学校に生徒は必ずいますが、部活に人がいないことはありえます。

よって、このようなときに誘導可能性として表現されます。

依存

依存はクラス内のメソッドでオブジェクトを引数として使用する関係を表します。

集約や誘導可能性のように包含関係が成り立つわけではないが、メソッドの引数として使用されるときに使います。

この関係は集約や誘導可能性ほど強くないため、クラス型の属性(メンバ)として一方のクラス内に宣言しません

例えば、下図のようなケースで使用します。

※オブジェクトの数を表す多重度の記載は省いています。

部活の加入処理では部活クラスを引数としています。ちなみに、部活クラスのオブジェクトは学校クラス内に宣言されていません。

よって、このようなときに誘導可能性として表現されます。

クラス全体

ここまで学校クラス、生徒クラス、部活クラスを考えました。関係性は下記、クラスの全体図のとおりです。

本来であれば多重度やクラス型の変数名を書きますがここでは省いています。

抑えるべき重要な情報は3つです。

  • 生徒クラス型の変数が学校クラス内で宣言されていること
  • 生徒クラス型の変数が部活クラス内で宣言されていること
  • 学校クラスの部活加入処理メソッドの引数として部活クラス型のオブジェクトが必要であること

※オブジェクトの数を表す多重度の記載は省いています。

まとめ

  • 集約は全体クラスと部分クラスの関係を表す。
  • 誘導可能性はクラス内でオブジェクトを生成する関係を表す。
  • 依存はクラス内のメソッドでオブジェクトを引数として使用する関係を表す。

関係性の強さは集約>誘導可能性>依存という大小関係。

以上です。

-Java, コード設計, プログラミング

Copyright© SugLog , 2021 All Rights Reserved Powered by AFFINGER5.