インターフェースまたはクラスを返す


9

メソッドがあるとしましょう

public List<User> GetBatchOfUsers(IEnumerable<int> userIDs)
{
    List<User> users = new List<User>();

    // some database stuff

    return users;
}

を返すのではなく、インターフェイス(IListまたはのいずれかIEnumerable)を返す方がよいことを読みましたList。私がそうすることについて聞いたいくつかの議論は、それがデータを隠すことであり、API開発者に後日データの内部表現を変更する柔軟性を与えます。

を返すだけの私の懸念IEnumerableは、ランダムアクセスやCountプロパティなどの機能を失うことです。

IEnumerableメソッドとして動作するための最小限の要件である、メソッドにデータを送信するための最高の柔軟性を消費者に与えるため、パラメーターとしてを受け入れることには意味があることを知っています。

戻り値型のベストプラクティスは何ですか?


5
さらに重要なのは、インターフェイスをパラメーターの型として受け取ることです。
Michael Borgwardt

回答:


10

一般的に言えば、インターフェイスから始めて、予想よりも頻繁に追加のメソッドを使用していることがわかった場合にのみ、具象型を戻り値の型として配置するように移動できます。

ええと、インターフェイスを返すと、柔軟性が高まります。後で実装を変更して、異なる具象型を返すことができます。一方、発信者に提供する情報が少ないため、特定の操作を実行できない場合があります。(たとえば、を返すList<T>場合、呼び出し元はConvertAllなどを使用できますが、返すことを宣言するだけではできませんIList<T>。)状況によっては、具象型を指定する価値があります。

CountまたはSortメソッドに関しては、そのための標準のコレクションインターフェイスはありません。ただし、任意のIListをソートまたはカウントする拡張メソッドを作成できます。


これは本当に難しいルールではないでしょうか?
マシュー

はい、それは本当に使用法に依存します。
Yusubov

1

コレクションを必要とする場合は、Countを使用できますがICollection<T>、これは十分に一般的です。


-1。カウントはすでに議論されており、この答えは何も新しいものを追加しません
superM '08 / 08/12

@Konrad Rudolph、これは答えではなく、コメントです。
superM 2012

@superMそれはそれ自身の答えに値するのに十分価値があると私は思います。
Konrad Rudolph、

1

定義しているメソッドに対して賢明なものを返します。一連のアイテム(フォーカスはアイテムにあります)を返すのですか、それともアイテムのコレクション(フォーカスはコレクション全体にフォーカスしています)を返していますか?コレクションの実装に差異を認めることは価値がありますか?ジェネレータを使用することが意味をなさない場合、またはHashSet単にを使用する場合List


1

メソッドの例に固有:戻るIEnmuerable<T>とはCount、インデックスとインデックスの機能が失われることを意味します(ただし、LINQメソッドCount()とを使用できます。ElementAt()IList<T>

に戻った場合IList<T>、一部の機能が失われますが、一般的な利点はおそらく価値があります。

しかし、返されたコレクションをコンシューマーが変更することはおそらく意味がありませんが、使用またはインデックス付けすることには意味があるので、IEnumerable<T>との間がより適切です。IList<T>Count

.Net 4.5には、次のようなインターフェースがありますIReadOnlyList<T>


IReadOnlyListVS2013を入手できると良さそうです、ありがとう!
マシュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.