2011-02-19 8 views
5

多くのイテレータやデータリーダーは、DataReaderXmlReaderIEnumerator、さらに多くのものがあります。(あなたはアイデアを得ました)です。ほとんどの場合、トラバーサル転送のみがなぜですか?

forward-only通常、自分のニーズに合わせてデータイテレータを作成するときは、通常、両サイドのナビゲーションのサポートを追加してみてください。ほとんどの場合、逆方向のトラバースは必要ありませんが、時には必要があるため、必要なときにデータを保持するために変数または何かを作成することになります。


だから私の質問は以下のとおりです。

  • はなぜほとんどのデータ・イテレータ前進のみ

  • iは後方たどれるイテレータ/データリーダーを作成する間違っています。どうしてフレームワークが組み込みのデータイテレータをサポートしていないのでしょうか?

  • は、我々はすべての深刻パフォーマンスの欠点またはそのわずかないは、このような機能を持って良いデザインを検討しています。


この質問は私に最初から多くのことを盗聴が、私はhere.I多くの開発者は、後方トラバースは時々役立つことができることを私と一緒に同意することができると信じていないことを求めているので、満足のいく答えを得たことがありません。

答えて

9

「前方のみ」である:

  • 実装が簡単ほとんどの消費者
  • の最も一般的な使用、に最も可能性が我々が最も生産
  • で唯一のものを実装するので、メモリ内のすべてのデータをバッファしたくないと仮定した場合に保証されます
  • ランダムアクセス(中程度のサイズのデータ​​用)を容易にバッファリングします

たとえば、データベース、ネットワークストリームなどからデータを読み取っている場合、「転送」の保証のみが可能です。確かに、すべてのデータを任意にバッファリングする必要はありません。巨大なとなる可能性があります。

クライアントは、データ量が非常に多いと考えている場合は、ToList()などと呼んでいつでもメモリにバッファリングしてランダムアクセスを許可することができます。

たとえば、この完全に有効シーケンスを検討:

public static IEnumerable<int> LotsOfData() { 
    var random = new Random(); 
    while(true) yield return random.Next(); 
} 
  • それはバッファリングせずに戻すことはできませんが
  • それは長さが無限であるので、バッファリングすることはできません

明らかにその例はほとんどありませんが、ソケット、データベース、または大きなファイルからの読み取りは、ess同じシナリオのです。

+0

あなたはそのシナリオに間違いありませんが、大きなファイルからでもデータを読み込んでいる間は、少し後ろに読むと問題になることがあります。ロジックはポインタをいくつかのビットに戻して再度読み込むようなものになります。もちろん、もう少しコードを書く必要があります。だからこのデザインで何がうまくいかないのでしょうか? –

+0

よく考えてみましょう(基本的に)すべてのために働く1つの一般的な基本的なアプローチを持つことです。特殊なシナリオ(逆方向読み込みやランダムアクセスなど)で他のアクセス方式を使用できないようにするものはありません – Foxfire

+0

基本SRP :)。オブジェクトに必須ではない機能を追加しないでください。また、 - 私は弾丸4が好きです。必要に応じて、バッファリングを追加するのは簡単です。 – Goran

関連する問題