6

今日、私はオブジェクトプログラミングスタイル、具体的なタイプ、またはインターフェイスの基本的なパラドックスに到達しました。

メソッドの戻り型(具象型またはインターフェース)のより良い選択は何ですか?

ほとんどの場合、メソッドの戻り型として具象型を使用する傾向があります。なぜなら、具体的なタイプは、さらに使用するためにより柔軟であり、より多くの機能を公開すると信じているからです。

これの暗い面:カップリング。天使のようなもの:具体的なタイプには、最初に返すインターフェイス自体と、追加の機能が含まれています。

あなたの親指のルールは何ですか?

このためのプログラミングの原則はありますか?


ボーナス:これは、メンバーコレクションを公開するためのReadOnlyCollectionまたはIEnumerableの意味の例ですか?

4

3 に答える 3

8

経験則では、リターンタイプでは可能な限り具体的であり、パラメータタイプでは可能な限り非具体的です。APIのクライアントを変更せずに、必要に応じて後で実装を交換できるため、インターフェイスも優先します。

于 2010-04-21T00:08:15.637 に答える
8

私の経験則:

1)必要に応じて後で具象型に変更するのはいつでも簡単なので、最初はメソッドにインターフェイス型を返してもらいます。逆に戻るのは難しい。

2)メソッドが具象型を返すように宣言されている場合でも、可能な限りインターフェイス型を使用するように呼び出し元をコーディングします
InterfaceType i = xyz.methodThatReturnsConcreteType();

3)呼び出し元のコードを所有しているかどうかによっても違いが生じます(内部APIとパブリックAPI)。

  • 問題のメソッドを呼び出すコード(つまり、内部API)を所有している場合は、具体的な型を返すことをいとわないでしょう。
  • このメソッドを呼び出すコード(パブリックAPIなど)を制御しない場合、代わりにインターフェイスタイプを返す可能性が高くなります。具体的なタイプを返すことはコミットメントであり、一般的に言えば、約束が少なければ少ないほど簡単です。

その他の考慮事項:

  • インターフェイスを実装するモックオブジェクトを使用できるため、インターフェイスを使用するとテストが簡単になる場合があります。
  • プロキシオブジェクトを返したいという外部の可能性があります(今は本当に言い訳になります)

要約すれば、

  • 緩い結合の利点は、具体的なタイプに完全にアクセスできるという利便性よりも重要であると感じているため、通常はインターフェイスタイプを返します。
  • ただし、ルーズカップリングの利点よりも利便性が重要である場合はいつでも、ケースバイケースでコンクリートタイプを返すように切り替えることに反対していません。
于 2010-04-21T00:59:48.157 に答える
1

興味深い質問です。返品データをどのように使用できるかを自問する必要があると思います。あなたが持っていた場合は、古い車のアナロジーを使用して

public AccelerationResponse PressAccelerator(float force) {}

クラスではなくインターフェースを返したい場合があります。特定の条件に応じて、この応答を異なる方法で解釈している可能性があります。

リターンが具体的な実装で期待される方法でのみ使用できることが保証されている場合は、そのクラスを使用するのが理にかなっています。広く受け入れられている原則はわかりませんが、私の経験則では、リターンタイプをさまざまな実装で再利用できるかどうかは、インターフェイスの方が理にかなっています。

于 2010-04-21T00:08:54.717 に答える