🦭

OOPにおけるクラス間関係の体系的整理

に公開

本格的にプログラミングを勉強するにあたりオブジェクト指向を学んでいるけど、has-a/is-a や 合成/集約/依存とかの言葉で表現される概念がよく分からなかったので、賢い ChatGPT ちゃんに聞きながら体系的にまとめたメモです。
Mermaid 記法:https://mermaid.js.org/syntax/classDiagram.html

0. 概要

オブジェクト指向プログラミングにおけるクラス間の主要な関係は、is-a, has-a 関係に大別される

1. 概念の分類(is-a vs has-a)

関係の分類 対応するフレーズ 基本的な意味 実装方法
is-a 関係 A は B である 継承 継承
has-a 関係 A は B を持っている 構成、利用(包含) メンバ変数としてオブジェクトを持つ

2. has-a 関係の詳細4分類

has-a 関係は、結合の強さ(特にライフサイクルの依存性)によって、合成/集約/関連/依存の4つに分類される

種類 結合の強さ ライフサイクル依存 所有の概念 使用の概念 Mermaid 記法
Compostion(合成) 最も強い あり 強い所有(全体に不可欠) 部品として利用 *--
Aggregation(集約) 中程度 なし 弱い所有(全体から独立可) 構成員として管理 o--
Assosication(関連) 弱い なし なし 参照・利用 (uses) <--
Dependency(依存) 最も弱い なし なし 一時的な利用 (temporary use) <..

2.1 Composition(合成)*--

  • 特徴:
    • 全体と部分の強い結びつき
    • 部分オブジェクトは全体が存在しないと存在できない
    • 全体の破棄で部分も破棄される(ライフサイクル一致)
  • 例:
    • House has-a (owns) Room
    • Car has-a (owns) Engine

2.2 Aggregation(集約)o--

  • 特徴:
    • 全体と部分の関係だが、ライフサイクルはそれぞれ独立している
    • 外部から渡されたオブジェクトを保持(DIなど)
    • 「所有しているが、管理していない」関係
  • 例:
    • Department has-a (owns) Employee
    • Library has-a (owns) Book

2.3 Association(関連)<--

  • 特徴:
    • 一般的なクラス間の参照関係
    • メンバ変数として参照する場合に該当
    • 所有ではなく「参照して利用する(uses)」程度の関係
  • 例:
    • Person uses CreditCard
    • Driver uses Car

2.4 Dependency(依存)<..

  • 特徴:
    • 最も弱い関係性(temporary use)
    • 引数やローカル変数で一時的に別クラスを利用
    • 「参照はするが、保持・所有はしない」
  • 例:
    • コンストラクタ引数で利用するが保持しない
    • メソッド内で一時的に他のクラスを利用

3. owns と uses の位置づけ

フレーズ 当てはまる概念 抽象度 補足
owns (所有) 合成 / 集約 中〜高 has-a の関係性の中で、ライフサイクルの管理に焦点を当てた関係
uses (使用) 関連 / 依存 has-a の関係性の中で、機能の利用に焦点を当てた関係

4. is-a 関係の詳細:Inheritance(継承)<|-- & Realization(実装)<|..

  • 特徴:
    • 分類(カテゴリ)を表す関係
    • スーパークラスの仕様をサブクラスが引き継ぐ
    • 多態性(ポリモーフィズム)を実現
    • 一般的には継承は設計の難易度を上げてしまうため、継承よりは合成/集約/関連を用いる設計にする事が推奨される

5. まとめ

関係 Mermaid記法 所有の強さ 典型的な使用例
継承(Inheritance) <|-- - クラス階層構造
実装(Realization) <|.. - インターフェース実装
合成(Composition) *-- 強い 内部生成・完全所有
集約(Aggregation) o-- 中程度 外部DI・共有参照
関連(Association) <-- 弱い 参照・利用
依存(Dependency) <.. 最弱 一時的利用(引数やローカル)

Discussion