質問

反復処理できる従業員のリストを返すクラスメソッドがあります。リストを返す最良の方法は何ですか?通常は ArrayList を返すだけです。ただし、私が理解しているように、この種のアクションにはインターフェイスの方が適しています。使用するのに最適なインターフェイスはどれですか?また、実装 (ArrayList オブジェクトなど) ではなくインターフェイスを返す方が良いのはなぜですか?私にはもっと大変な作業のように思えます。

役に立ちましたか?

解決

個人的には、 リストバックエンドでリストを作成するために <Employee> を使用し、 IList いつ戻るの。インターフェイスを使用すると、コードの使用者を変更することなく実装を変更できる柔軟性が得られます。ArrayList にこだわりたい場合は、非ジェネリックになります。 IList.

他のヒント

@ジェイソン

実際には配列がこのインターフェイスを実装しているため、IList<> を返すこともできます。

このようなことを行う最良の方法は、あなたが言うように、できればジェネリックを使用してリストを返すことです。そのため、リストになります。<Employee>.

ArrayList ではなく List を返すということは、後で LinkedList などを使用することにした場合、最初にオブジェクトを作成する場所 (つまり、「new」の呼び出し) 以外のコードを変更する必要がないことを意味します。配列リスト())"。

リストを反復処理するだけの場合は、リストを IEnumerable (.NET の場合) として返すメソッドを定義できます。

必要な機能だけを提供するインターフェイスを返すことで、将来、アプリケーションに適した/より高速/より適切な新しいコレクション型が登場した場合、それが IEnumerable を実装している限り、メソッドを完全に書き直すことができます。それを呼び出すコードを一切変更せずに、その中にある新しい型を呼び出します。

コレクションを注文する必要がある理由はありますか?なぜ単純に返さないのですか IEnumerable<Employee>?これにより、必要な最低限のものが提供されます。後でバッグ、セット、ツリーなどの他の形式のストレージが必要になった場合でも、契約はそのまま残ります。

私はインターフェイスを返す方が良いという前提に同意しません。その理由は、コードの特定のブロックが公開する有用性を最大化したいからです。

このことを念頭に置いて、インターフェイスは項目を引数として受け入れるために機能します。関数パラメータが配列または ArrayList を呼び出す場合、それに渡すことができるのはそれだけです。関数パラメータが IEnumerable を呼び出す場合、そのいずれか、および他の多くのオブジェクトを受け入れます。より便利です

ただし、戻り値は逆に機能します。IEnumerable を返す場合、できることは列挙することだけです。List が手元にあり、それを返す場合は、関数を呼び出すコードでカウントの取得など、他の多くのことも簡単に実行できます。

ただし、私は ArrayList から離れるようにアドバイスする人たちと団結します。ジェネリックというのは、 良くなったね。

インターフェイスは、実装と実装のユーザーの間の契約です。

インターフェイスを使用すると、ユーザーとの契約を維持する限り、実装をいくらでも変更できます。

また、複数の実装で同じインターフェイスを使用できるため、ユーザーはインターフェイスと対話するコードを再利用できます。

どの言語について話しているのかは述べていませんが、.NET っぽいものでは、IList を返すのは、List や ArrayList を返すのと同じくらい簡単です。ただし、その廃止されたクラスについて言及するだけで、あなたはそう思っているのではないかと思います。 .NET の話ではありません。

インターフェイスは本質的に、クラスが特定のメソッドまたは属性を持つという契約です。直接実装ではなくインターフェイスにプログラミングすると、「契約」がまだ保持されている限り実装を完全に交換できるため、より動的で管理しやすいコードが可能になります。

あなたが説明したケースでは、インターフェイスを渡すことには特別な利点はありません。私であれば、ジェネリック型で ArrayList を渡すか、Array 自体を渡します。list.toArray()

実際、フレームワークの場合は List を返すべきではありません。少なくとも、使用することをお勧めするクラスは Collection です。List クラスでは、サーバーの拡張性の問題を犠牲にしてパフォーマンスがいくつか向上しています。これは実際には FXCop ルールです。

あなたにはその理由があります この記事

メソッドの戻り値の型は次のようにする必要があります IList<Employee>.

つまり、メソッドの呼び出し元は、次のものを何でも使用できます。 IList を提供しますが、特定のものは使用できません ArrayList. 。そして、ある時点でそう感じたら、 LinkedList または YourCustomSuperDuperList パフォーマンスが向上したり、その他の利点があるため、メソッド内で安全に使用でき、呼び出し元を混乱させる必要はありません。

それはおおよそインターフェイス 101 です。;-)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top