反復できる従業員のリストを返すクラスメソッドがあります。リストを返すための最良の方法は何ですか?通常、私はArrayListを返すだけです。ただし、私が理解しているように、インターフェイスはこのタイプのアクションに適しています。使用するのに最適なインターフェースはどれですか?また、実装(ArrayListオブジェクトなど)ではなく、インターフェイスを返す方がよいのはなぜですか?それは私にはもっと多くの仕事のように思えます。
11 に答える
個人的には、バックエンドでリストを作成するためにList <Employee>を使用し、戻ったときにIListを使用します。インターフェイスを使用すると、コードを使用しているユーザーを変更することなく、実装を変更できる柔軟性が得られます。ArrayListを使い続けたい場合は、非ジェネリックIListになります。
@ジェイソン
配列が実際にこのインターフェイスを実装しているため、IList<>を返すこともできます。
このようなことを行う最良の方法は、あなたが言うように、できればジェネリックを使用してリストを返すことです。したがって、それはリスト<Employee
>になります。
ArrayListではなくListを返すということは、後でLinkedListなどを使用することにした場合、最初にオブジェクトを作成した場所以外のコードを変更する必要がないことを意味します(つまり、「new」の呼び出し配列リスト())"。
リストを反復処理するだけの場合は、リストをIEnumerable(.NETの場合)として返すメソッドを定義できます。
必要な機能だけを提供するインターフェイスを返すことで、将来、アプリケーションにより適した/高速な/より適切な新しいコレクションタイプが登場した場合でも、IEnumerableを実装している限り、メソッドを完全に書き直すことができます。それを呼び出すコードを変更せずに、その中の新しいタイプ。
インターフェイスを返す方がよいという前提には同意しません。私の理由は、特定のコード ブロックが公開する有用性を最大化したいからです。
それを念頭に置いて、インターフェイスはアイテムを引数として受け入れるために機能します。関数パラメーターが配列または ArrayList を呼び出す場合、それがそれに渡すことができる唯一のものです。関数パラメーターが IEnumerable を呼び出す場合、IEnumerable と他の多くのオブジェクトを受け入れます。それはもっと便利です
ただし、戻り値は逆に機能します。IEnumerable を返すときにできることは、それを列挙することだけです。リストが手元にあり、それを返す場合、関数を呼び出すコードは、カウントの取得など、他の多くのことも簡単に実行できます。
ただし、ArrayList から離れるようにアドバイスしている人々と私は団結しています。ジェネリックのほうがはるかに優れています。
コレクションを注文する必要がある理由はありますか? 単純に を返さないのはなぜIEnumerable<Employee>
ですか? これにより、必要最小限のものが得られます。後で、バッグ、セット、ツリーなどの他の形式のストレージが必要になった場合でも、契約はそのまま残ります。
メソッドの戻り値のタイプは。である必要がありますIList<Employee>
。
つまり、メソッドの呼び出し元は、を提供するものはすべて使用IList
できますが、に固有のものは使用できませんArrayList
。LinkedList
次に、ある時点で、より優れたパフォーマンスやその他の利点を提供していると感じた場合はYourCustomSuperDuperList
、メソッド内で安全に使用でき、呼び出し元を台無しにすることはありません。
これはおおよそインターフェース101です。;-)
インターフェースは、実装と実装のユーザーとの間の契約です。
インターフェイスを使用することで、ユーザーのコントラクトを維持している限り、実装を必要なだけ変更できます。
また、複数の実装で同じインターフェイスを使用できるため、ユーザーはインターフェイスと対話するコードを再利用できます。
話している言語はわかりませんが、.NETのようなものでは、リストやArrayListよりもIListを返すのは簡単ですが、その廃止されたクラスについて言及するだけで、あなたは.NETについて話していません。
インターフェイスは基本的に、クラスが特定のメソッドまたは属性を持つというコントラクトです。「コントラクト」が保持されている限り、実装を完全に交換できるため、直接実装ではなくインターフェイスにプログラミングすることで、より動的で管理しやすいコードが可能になります。
あなたが説明する場合、インターフェースを渡すことはあなたに特別な利点を与えません、それが私なら、私はジェネリック型でArrayListを渡すか、配列自体を渡します:list.toArray()
実際には、それがフレームワークである場合は List を返すべきではありません。少なくとも考えずにはいられません。使用する推奨クラスは Collection です。List クラスは、サーバーの拡張性の問題を犠牲にしてパフォーマンスが向上しています。実際、これは FXCop ルールです。
この記事にその理由があります