この記事では、主に合成、集約、再利用の原理を紹介します。編集者はそれを参考として共有します。エディターをフォローして見てみましょう
構成、集約、再利用の原則
構成と再利用の原則は、構成/集約再利用原則 (CARP) とも呼ばれ、その定義は次のとおりです:
複合再利用原則 (CRP): 再利用を実現するには、継承の代わりにオブジェクトの組み合わせを使用するようにしてください。
合成と再利用の原理は、関連付け関係 (結合関係や集約関係を含む) を通じて新しいオブジェクトの一部の既存のオブジェクトを使用し、それらを新しいオブジェクトの一部にすることです。新しいオブジェクトは委任メソッドを通じて既存のオブジェクトを呼び出します。関数を再利用する目的。つまり: 再利用する場合は、結合/集約関係 (関連付け関係) を使用し、継承の使用を減らすようにしてください。
オブジェクト指向設計では、異なる環境で既存の設計と実装を 2 つの方法、つまり合成/集約関係または継承を通じて再利用できますが、最初に合成/集約、合成/集約の使用を検討する必要があります。システムがより柔軟になり、クラス間の結合が軽減されます。継承を使用する場合は、継承の使用が効果的な Liskov 置換原則に厳密に従う必要があります。継承を乱用すると、システムの構築と保守が困難になり、システムが複雑になるため、継承の再利用は注意して使用する必要があります。
継承による再利用の主な問題は、継承により基本クラスの実装の詳細がサブクラスに公開され、通常は基本クラスの内部詳細がサブクラスに表示されるため、継承の再利用によってシステムのカプセル化が破壊されることです。したがって、この種の再利用は「ホワイト ボックス」再利用とも呼ばれます。基本クラスが変更されると、サブクラスの実装も変更する必要があります。基本クラスから継承された実装は、実行時に変更できません。十分な柔軟性がなく、継承は限られた状況 (継承されないと宣言されていないクラスなど) でのみ使用できます。
拡張
継承について詳しく理解するには、書籍『ソフトウェア アーキテクチャ デザイン』の著者である Wen Yu 氏の記事「山を見るのはただの水 - 継承の理解を向上させる」を参照してください。継承" 。
結合または集約関係は、既存のオブジェクト (メンバー オブジェクトとも呼ばれます) を新しいオブジェクトに組み込んで新しいオブジェクトの一部にすることができるため、新しいオブジェクトは既存のオブジェクトの関数を呼び出すことができます。これにより、内部実装の詳細が作成されます。メンバー オブジェクトは新しいオブジェクトからは見えないため、この種の再利用は「ブラック ボックス」再利用とも呼ばれ、継承関係と比較すると結合度が比較的低く、メンバー オブジェクトの変更は新しいオブジェクトにほとんど影響を与えません。実際のニーズに応じて新しいオブジェクトでメンバー オブジェクトの操作を選択的に呼び出すことができ、合成再利用は実行時に動的に実行でき、新しいオブジェクトは同じタイプの他のオブジェクトをメンバー オブジェクトとして動的に参照できます。
一般的に言えば、2 つのクラス間の関係 が「Has-A」である場合、合成または集約を使用する必要があり、関係が「Is-A」である場合、継承 を使用できます。 「Is-A」は厳密な分類学的定義であり、あるクラスが別のクラスの「一種」であることを意味し、「Has-A」は異なり、特定の役割が特定の責任を持っていることを意味します。
以下は、合成と再利用の原理の理解を深めるための簡単な例です:
CRM システムの初期設計において、Sunny Software Company の開発者は、顧客の数が多くなく、システムはデータベースとして MySQL を使用しており、CustomerDAO クラスなどのデータベースに接続するためのメソッド getConnection() が DBUtil クラスにカプセル化されています。 DBUtil クラスの再利用が必要な場合、設計者は CustomerDAO を DBUtil クラスのサブクラスとして使用します。 図 1 に示すように、初期設計構造は次のとおりです。顧客の数に応じて、システムは Oracle データベースにアップグレードすることを決定したため、Oracle データベースに接続するために新しい OracleDBUtil クラスを追加する必要がありました。そのため、最初の設計計画では、CustomerDAO と DBUtil の間に継承関係がありました。データベース接続方法を変更するには、CustomerDAO クラスのソース コードを変更し、CustomerDAO を OracleDBUtil のサブクラスとして使用する必要があります。これは、開始と終了の原則に違反します。 [もちろん、DBUtil クラスのソース コードを変更することもできますが、これも開始と終了の原則に違反します。 】
現在、合成と再利用の原理を使用して再構築されています。
合成再利用の原則によれば、再利用を実装する際には、
。したがって、この例では、連想再利用を使用して継承再利用を置き換えることができます。再構築された構造を図 2 に示します。
図 2 では、CustomerDAO と DBUtil の関係が継承から関連付けに変わり、DBUtil オブジェクトを CustomerDAO に注入するために使用されます。コンストラクター インジェクションまたは Setter インジェクションを使用できます。 DBUtil の機能を拡張する必要がある場合は、サブクラス OracleDBUtil を通じて Oracle データベースに接続するなど、そのサブクラスを通じて拡張できます。 CustomerDAO は DBUtil 用にプログラムされているため、Liskov 置換原則に従って、DBUtil サブクラスのオブジェクトで DBUtil オブジェクトを上書きできます。サブクラスによって拡張されたメソッドを使用するには、サブクラス オブジェクトを CustomerDAO に挿入するだけです。例えば、CustomerDAO に OracleDBUtil オブジェクトを注入することで、元のコードを変更することなく Oracle データベース接続を実現でき、新しいデータベース接続方法を柔軟に追加できます。
以上がJava の構成、集約、再利用の原則を図で詳しく説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。