この質問を促したのは私との話し合いだったので、ユーロ・ミチェリはすでに私の答えを知っていますが、ここにあります! :)
Linq to Objects は、この質問に対するすばらしい答えをすでに提供していると思います。可能な限り単純なインターフェイスを一連のアイテムに使用することで、そのシーケンスの実装方法について最大限の柔軟性が得られます。これにより、遅延生成が可能になり、パフォーマンスを犠牲にすることなく (実際の意味ではなく) 生産性が向上します。
時期尚早の抽象化にはコストがかかることは事実ですが、主にそれは新しい抽象化を発見/発明するコストです。しかし、完全に優れたものが既に提供されている場合、それらを利用しないと気が狂うでしょう。それが、ジェネリック コレクション インターフェイスが提供するものです。
アクセスする必要がある場合に備えて、クラス内のすべてのデータを公開する方が「簡単」であると言う人がいます。IList<T>
同様に、Euro は、 などのコンテナー(または具象クラスList<T>
) への豊富なインターフェイスを使用してから、混乱を後でクリーンアップする方がよいとアドバイスしました。
ただし、アクセスしたくないクラスのデータメンバーを非表示にして、後でそのクラスの実装を簡単に変更できるようにする方が良いと思うので、参照できる最も単純なインターフェイスを使用する必要があります一連のアイテム。シンプルで基本的なものを公開することから始めて、後でそれを「緩める」方が、緩いものから始めてそれに秩序を課すのに苦労するよりも、実際には簡単です。
IEnumerable<T>
したがって、シーケンスを表すために行うと仮定します。次に、Add
またはRemove
アイテムが必要な場合 (ただし、インデックスによるルックアップは必要ありません) を使用しますIContainer<T>
。これは継承するIEnumerable<T>
ため、他のコードと完全に相互運用できます。
このようにして、そのコードがデータに対して何を実行できるかが完全に明確になります (一部のコードをローカルで調べるだけで)。
小さなプログラムは抽象化をあまり必要としません。それは事実です。しかし、成功すると、大きなプログラムになる傾向があります。最初に単純な抽象化を採用すると、これははるかに簡単になります。