3

現在、単純なデータ アクセス レイヤーをコーディングしていますが、他のレイヤーにどの型を公開する必要があるのか​​疑問に思っていました。

Data を List<> として内部的に実装する予定ですが、不要な場合は List 型を消費者に公開しないことについて読んだことを覚えています。

public List<User> GetAllUsers() // non C# users: that means List of User :)

理由を知っていますか (Google は役に立ちませんでした)。あなたは通常、そのようなもののために何を公開しますか? Iリスト? IEnumerable?

4

3 に答える 3

6

通常は、ユーザーが有意義に操作できる、最も強力でないインターフェイスを公開することをお勧めします。ユーザーが列挙可能なデータのみを必要とする場合は、 を返しIEnumerable<User>ます。ユーザーがリストを変更できるようにする必要があるためにそれが十分でない場合 (注意! 多くの場合、そうではありません)、. を返しますIList<User>

/編集:

Joel は彼のコメントで有効な質問をしています。(言い換え)

この背後にある考え方は、データを返すメソッドは、ユーザーがそのコンテンツを変更することを想定していない可能性があるということです。クラスの別のメソッドは、リストへの参照が返された後も、リストが空ではないことを想定している可能性があります。ユーザーがリストからすべてのデータを削除するとします。もう 1 つのメソッドは、ele が不要であった可能性があることを追加で確認する必要があります。

さらに重要なことに、これにより、戻り値の型を通じて内部実装の一部が公開されます。将来、コンテナーを使用しないように実装を変更する必要がある場合IListは、問題があります。ビルドを壊す変更を導入して、メソッド コントラクトを変更する必要があります。または、データをリスト コンテナーにコピーする必要があります。

Values例として、効率的な実装が Dictionary を使用し、を実装しないコレクションを返すだけだと想像してくださいIList

于 2008-10-14T16:05:08.050 に答える
3

間違いなくISomethingです。インターフェイスを使用すると結合が減り、後でデータ層の実装の詳細を変更しやすくなります。どのインターフェイスかは状況によって異なります。IList は優れていますが、ICollection 機能が必要な場合や、ReadOnly の値を指定したい場合があります。

于 2008-10-14T16:04:57.270 に答える
2

IEnumerableを返す前に、慎重に検討する必要があります。基になるコードが「yield」を使用してIEnumerableを生成している場合、またはLINQを使用している場合は、使用されているリソースを開いたままにしておくことになります。

IEnumerableを返す前に、別のIEnumerableにコピーする必要があります。IListを使用することにより、これを要件にして、不注意でIEnumerableを返すことがないようにします。

一方、IListを返すことは、呼び出し元に、返されたリストを変更できることを意味します。

于 2008-10-14T16:13:52.323 に答える