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

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

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

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

そこで、よく出てくる矢印である集約、誘導可能性、依存の3つの違いを説明していきます。

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

3つの違いを一言で

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

その理由と各矢印の意味について話していきます。

各矢印の説明と具体例

※図は、クラス名(1番上)、属性(真ん中)、メソッド(下)を含んでいます。

集約

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

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

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

属性(メンバ)とはクラス内で静的に宣言する変数のことです。

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

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

学校は生徒の一部であることは直感的にわかるため、わかりやすい記号だと思います。

誘導可能性

誘導可能性は集約よりももっと疎な関係を表します。

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

これじゃ集約と一緒じゃんと思うかもしれません。誘導可能性の場合、部分クラスほど密接なわけではなく、矢印先のオブジェクトにアクセスし、メソッドを使用する可能性があるくらいの認識で良いと思います。

集約と同じとこもあって、一方のクラス内にクラス型の属性(メンバ)を宣言します。

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

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

生徒クラスは部活クラス内でオブジェクトの型として宣言されています。

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

依存

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

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

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

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

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

部活の加入処理では部活オブジェクトを引数とするメソッドが存在します。

このようなときに依存として表現されます。

クラス全体

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

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

  • 集約と誘導可能性では、オブジェクトが別クラス内で属性として、宣言されている
  • 集約と誘導可能性では、基本的にA has a Bの関係であること
  • 依存では、オブジェクトが別クラスのメソッドの引数として使用されていること

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

まとめ

新人研修でUMLの勉強させられた時は、なんでこんなことするんだろと思ってました。

しかし、綺麗なコードは良い設計から生まれます。今回、設計で使用されるクラス図について理解を深めれて良かったです。

最後に、関係性の強さは集約>誘導可能性>依存という大小関係です。

以上、お疲れさまでした。

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

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