Java および他のオブジェクト指向デザインパターンでは、クラス間には主に 6 種類の関係があります。それらは依存、関連、集約、合成、継承、実装です。これらの関係は、徐々に結合度が高くなります。
- 垂直関係
- 継承
- 実装
- 水平関係
- 依存
- 関連
全体と部分
構成型の全体と部分、集合型の全体と部分
継承関係 / 汎化関係#
継承は、クラス(サブクラス、サブインターフェースとも呼ばれる)が他のクラス(スーパークラス、スーパーインターフェースとも呼ばれる)の機能を継承し、自分自身の新しい機能を追加できる能力を指します。Java では、継承関係はキーワード「extends」で明示的に示されますが、一般的には議論の余地はありません。UML クラス図では、継承は空の三角矢印を持つ実線で表され、サブクラスからスーパークラス、またはサブインターフェースからスーパーインターフェースに向かっています。
実装関係#
実装は、クラスがインターフェース(複数の場合もあります)を実装する機能を指します。実装は、クラスとインターフェースの間で最も一般的な関係です。Java では、このような関係はキーワード「implements」で明示的に示されますが、一般的には議論の余地はありません。UML クラス図では、実装は空の三角矢印を持つ破線で表され、クラスから実装されるインターフェースに向かっています。
依存関係#
単純に理解すると、依存関係はクラス A が別のクラス B を使用することを意味しますが、このような使用関係は偶発的で一時的で非常に弱いです。メソッドの実行が完了すると、この関係は存在しなくなります。つまり、一時的に機能を使用しただけですが、クラス B の変更がクラス A に影響を与える可能性があります。例えば、誰かが川を渡るために船を借りる必要がある場合、人と船の関係は依存関係です。コードのレベルでは、クラス B がクラス A のあるメソッドでパラメータとして使用されることを意味します。UML クラス図では、依存関係はクラス A からクラス B に向かう矢印で表されます。プログラム全体のフロー(プログラムのライフサイクル)の中で、あるステップ、あるいくつかの有限のステップで、別のクラスの機能が必要です。
1 つのメソッドで別のクラスを呼び出す
言い換えると、1 つのクラスのローカル変数は別のクラスのオブジェクトの参照です
関連関係#
関連は、2 つのクラス間の意味レベルでの強い依存関係を表します。例えば、私と私の友人の関係は依存関係よりも強く、依存関係の偶発性や一時性は存在せず、一般的には長期的な関係です。また、両者の関係は一般的に平等です。関連は単方向または双方向の場合があります。コードのレベルでは、関連クラス B が関連クラス A 内で属性として表示されます。
ClassC cc = new ClassC()
ClassC.staticVar
グローバル変数は、メンバ変数、静的変数を指します。
または、関連クラス A が関連クラス B の型のグローバル変数を参照している場合もあります。UML クラス図では、関連関係は関連クラス A から関連クラス B に向かう実線矢印で表され、関連の両端には関連の役割と多重性マーカーを付けることができます。
言い換えると、1 つのクラスのメンバ変数または静的変数は別のクラスの参照またはクラスオブジェクトの参照です
集約関係#
集約は、関連関係の特殊なケースであり、全体と部分の関係を表します。つまり、has-a の関係です。この場合、全体と部分は分離可能であり、それぞれが独自のライフサイクルを持つことができます。部分は複数の全体オブジェクトに属することも、複数の全体オブジェクトで共有されることもあります。例えば、コンピュータと CPU、会社と従業員の関係などがあります。航空母艦編隊には、海空母艦、護衛艦船、艦載機、原子力攻撃潜水艦などが含まれます。コードのレベルでは、関連関係と同じですが、意味レベルで区別することしかできません。UML クラス図では、集約関係は空のひし形と実線矢印で表されます。
1 つのクラスのコレクションの要素は別のクラスのオブジェクトの参照です
合成関係#
合成も関連関係の特殊なケースであり、contains-a の関係を表します。この関係は聚合よりも強く、強い聚合とも呼ばれます。これも全体と部分の関係を表しますが、この場合、全体と部分は分割できません。全体のライフサイクルが終了すると、部分のライフサイクルも終了します。例えば、人と人の脳などです。コードのレベルでは、関連関係と同じですが、意味レベルで区別することしかできません。UML クラス図では、合成関係は実線のひし形と実線矢印で表されます。
1 つのクラスのコレクションの要素は別のクラスのオブジェクトの参照です
まとめ#
継承、実装の関係についてはあまり疑問はありません。これらはクラスとクラス、またはクラスとインターフェースの垂直関係を表しています。他の 4 つの関係はクラスとクラス、またはクラスとインターフェースの参照、水平関係を表しており、区別するのは比較的難しいです。前述のように、これらの 4 つの関係はすべて意味レベルのものであり、コードのレベルでは完全に区別することはできませんが、全体的には、後の関係が表す強さの順に、合成 > 集約 > 関連 > 依存です。
ソフトウェア開発のプロセス
プロジェクト -> 要件の確定 -> モジュールの設計(モデル)-> コーディング -> テスト -> 納品とデプロイ -> 後続のメンテナンス