6

私が考えている例では、関数によってカプセル化できる約 4 行のコードがあり、この関数は同じ階層内の他のクラスで確実に使用されます。

そのコードを再利用するには、次のオプションがあります。

  1. 関数をコピーして、必要なクラスに貼り付けます。
  2. 関数を必要とするクラスの基本クラスを作成し、そこに配置します。
  3. DI を介してそれを必要とするクラスに渡される関数を含むクラス、または単にクラスのメンバーであるクラスを作成します。(かなりやり過ぎのようです)
  4. 静的ユーティリティ クラスを作成し、そのメソッドをその中に入れます。

私は間違いなく 1 または 4 を実行しません。以前は 2 を実行していましたが、継承の原則よりも構成を維持しようとしているので、4 に傾いていますが、最も可能性の高いものには多くのようです階層外で使用されることはなく、4 行のみです。私はこれが非常に厄介であることを知っていますが、それを行う正しい方法を見つけたいと思っています.

4

4 に答える 4

4

継承は何らかの理由で作成されました。乱用されているという事実は、正当な用途がないという意味ではありません。重要なのは、それを使用するかどうかは、簡単に再利用できるかどうかではなく、基本クラスが表すものに基づいて、基本クラスに属することが理にかなっているということです。

あなたのクラスが何であるか、そしてあなたが再利用しようとしているメソッドが何であるかをよく理解していなければ、あなたの特定のケースで具体的なアドバイスをすることはできません. しかし、次のように考えてみてください。「おそらく階層外では使用されないだろう」と言うとき、それは純粋にその階層の外では意味をなさないからですか? それとも、たまたまこの機能を使用するものを構築する人がいるとは思わないということですか?

この方法が、あなたが話している特定の階層の外で意味がある場合は、アプローチ #3 をお勧めします

そしてもちろん、これはすべて、そもそもクラス階層が本当に階層であることを前提としています。継承のもう 1 つの一般的な乱用は、アプリケーションのコンテキストで階層化する必要のないオブジェクトに階層化を強制する場合です。

于 2012-08-30T20:04:21.947 に答える
2

一般的に、構成は継承よりも優れたオプションであることに同意します。しかし、おそらく戦略パターンを介して何らかのロジックでオブジェクトを構成することは、複数のクラスで同じコードを再利用することとは別の問題です。

この機能を必要とするクラスがすべて同じ基本クラスを持っている場合は、それを基本クラスに入れるのが理にかなっています。この呼び出しを行うために、サブクラスが基本クラスの内部動作を知る必要があるわけではありません。

さまざまなサブクラスがこのコードの異なるバージョンを必要とする場合は、戦略パターン (コンポジションを使用) を介して動作を作成する方法があります。しかし、同じコードがすべてのサブクラスを満たすと仮定しています。

#4 はしません。なぜなら、そのコードは、それを呼び出すビジネスを持たない他のクラスで利用できるからです。コードが基本クラスにある場合は、コードを保護して、それを必要とするクラスだけが利用できるようにすることができます。

于 2012-08-30T19:58:15.827 に答える
2

そのような関数の引数がクラスのフィールドになる場合は、クラスの状態で動作することを意図しているため、そのような操作に対処する基本クラスのメンバーにする必要があります。

階層の外部または階層の複数のブランチからの意味のあるデータを操作し、パラメーターの意味がオブジェクトの状態にバインドされていない場合は、それをユーティリティ クラスの関数にします。

于 2012-08-30T20:09:37.873 に答える
1

特にクラス階層に関連している場合は、基本クラスを使用してください。そうでない場合は、オプション 4 を使用してください。ここでは合成は必要ありません。

于 2012-08-30T20:10:25.847 に答える