2017-12-21 11 views
0

私はパラメータの型は、インターフェイスメソッドであることと、どのような戻り値の型があるべきはずですどうあるべきかについていくつか質問がある - C#でコレクションを扱う場合。インターフェイスメソッドのパラメータの型と戻り値の型が

のは、私はAさんのコレクションを取得し、Bさんのコレクションを返すようにしたいとしましょう。私たちはいつも最も一般的なタイプを可能にし、最も特定のタイプを返すべきであるという親指のルールがあることを知っています。だからここだと例:ここでは

public interface A 
{ 
    B[] MyMethod(IEnumerable<A> myAs); 
} 

は、私はこの行から取得する質問です:

  1. インターフェースは私のシステムの内部にあるとき - 私はBの収集やコンクリートのためのインタフェースを返す必要がありますか?
  2. 配列の戻り値の型は、リストの戻り値の型よりも優れていますか?
  3. myAsパラメータは私のコードでは、myAsが実際にリストされている場合、パラメータはIEnumerableをする必要があり、ICollectionをまたはIListのを意味する、私は必要な最も一般的なインターフェイスタイプでなければなりませんか?私たちは常に可能な最も一般的なタイプを取得し、最も具体的なタイプを返す必要があります親指のルールがあります知っている

おかげ

+0

最後の2つはスタックオーバーフローで簡単に検索できます –

+0

アプリケーションの要件は何ですか? – Bahrom

答えて

6

いいえいいえいいえ。絶対違う。

親指の右側のルールは、あなたがあなたの発信者から可能な最小の契約が必要、そしてあなたが呼び出し側に最小許容契約を提供ということです。

前者はあなたが満たすためにそれらを必要としない契約を満たすために要求されるべきではない、あなたの発信者の便宜のためです。後者のルールは、実装の詳細を変更できるようにします。受け入れ可能な最小限のインタフェースを返すことによって、インタフェースの実装者は実装選択のために最も効率的な実装の詳細を選択できます。

インターフェイスがmyシステムの内部にある場合 - Bコレクションまたはコンクリートのインターフェイスを返すべきですか?

は、発信者の最小受諾契約です。呼び出し側は、インデックスを作成する必要があるが書き込む必要がないため、ReadOnlyCollectionをにする必要がありますか? にはが必要です。インデックスを作成して書き込む必要がありますが、サイズを変更する必要はないからです。 には、インデックスを作成し、それを書き、サイズを変更する必要があるので、リストとしてが必要ですか?または、単にのコレクションに列挙できるものがであることが必要ですか?

はどのようにして、発信者が必要とするものを知っていますか? コールサイトを作成する開発者に尋ねます。彼らはあなたの顧客ですから、あなたのメソッドを書く前にそれらから要求を集めます。

彼らはその後、を必要としないサービスがある場合は、これらの不要なサービスを提供することは、コストで来るので、彼らにを提供していません。あなたの発信者に彼らが利益を得ない費用を負担させないでください!また、インターフェイスの実装者が不必要なサービスの実装を提供するようにしないでください。

リストの戻り値の型は、リストの戻り値の型よりも優れていますか?

発信者がサイズの突然変異ではなく内容の突然変異を必要とする場合、配列はリストより優れています。しかし、どちらもかなりひどいです。 呼び出し元が実際にインデックスと突然変異を必要としていますか?ほとんどの発信者はしません。 IEnumerableを返す方がいいですし、配列やリストが必要な場合は、ToArrayまたはToListを呼び出してください。

ほとんどの場合、分かりやすいことはシーケンスを返すことだけです。呼び出し元は、リストまたは配列へのシーケンスを実現するための膨大なメモリを犠牲にするかどうかを決定できます。

myAsパラメータは、私が必要とする最も汎用的なインターフェイスタイプでなければなりません。myAsが実際にはリストであることを意味します。パラメータはIEnumerable、ICollectionまたはIListですか?

MyMethodの実装で使用できる最小のもの。 MyMethod が呼び出し元の代わりにコレクションを変更した場合は、を使用してIListを受け入れる必要があります。そうでない場合は、使用しないサービスを要求しないでください。それは単に呼び出し側でそれをより困難にします。

+0

総合的な説明をありがとう! –

関連する問題