オブジェクトを設計しているときに、テスト容易性の観点からはコンポジションがより良い選択であることがわかりました。その理由は、単体テストの実行中に、必要に応じて構成構造の一部をモックできるからです。継承階層がある場合、これは不可能です。
他の人もこれが構成を好む理由であるとわかっているかどうか知りたい. また、継承が使用されたために、他にどのようなテスト容易性の落とし穴に陥りましたか?
オブジェクトを設計しているときに、テスト容易性の観点からはコンポジションがより良い選択であることがわかりました。その理由は、単体テストの実行中に、必要に応じて構成構造の一部をモックできるからです。継承階層がある場合、これは不可能です。
他の人もこれが構成を好む理由であるとわかっているかどうか知りたい. また、継承が使用されたために、他にどのようなテスト容易性の落とし穴に陥りましたか?
デザイン パターンを使用して開発を開始すればするほど、継承よりも構成が優先されることがますます多く見られるようになると思います。私は実際、Head First: Design Patternsの本を信じています。「継承よりも構成を優先する」というのは、主要な設計原則の 1 つです。
テストのために構成の一部をモックアップできるというあなたの例は、おそらく可能な限り最高の例の1つです.
編集:デザインパターンの基本原則は継承よりも構成を優先することですが、それは必要な場所で継承を利用するデザインパターンがないという意味ではありません。もう 1 つの基本的な例は、抽象スーパークラスに向けてコーディングしているデコレーター パターンです (ただし、これは型の一致のためであり、「is-a」関係を実装するためではありません)。
どちらか一方の状況ではありません。彼らは競争相手ではありません。
継承は単体テストもかなり簡単です。ただし、抽象スーパークラスをテストするためにモック コンクリート クラスが必要になる場合があります。
継承は簡単に不適切に使用できます。一部のデザインは「is-a」の状況のように見えますが、実際にはそうではありません。より微妙な違いがあります。動作を他の属性から分離するために何らかの構成 (たとえば、 Strategy ) が必要な場合、実際には「動作のように」動作することがあります。
Gang of Four Design Patternsの本は基本的に、なぜ継承よりも構成を好むのかについてのすべてであり、それを行うための多くの方法を提供しています。いくつかの理由:
コンポジションがテストしやすい最大の理由は、(実装) 継承が、より壊れやすく (壊れやすい基本クラス) 分離してテストするのが難しい非常に結合されたクラスを作成する傾向があるためだと思います。
継承には確かに用途がありますが、継承よりも構成を好むことがますます多くなっています。
「クラス継承よりもオブジェクト構成を優先する」は、実際には GoF book からのものです。エーリッヒ・ガンマとのこの会話は、本からのこの考えを説明しています。
継承を必要とする 1 つの重要なパターンは、テンプレート メソッド パターンです。このパターンは非常に便利で広く使用されているため、継承は定着しています。継承を使用するもう 1 つの一般的なパターンは、複合パターンです。私が言いたいのは、継承をまったく軽視しないということですが、とにかく、非常に多くの一般的な API を見るだけでそれが明確になることを願っています...