2011-07-13 25 views
4

多くの文章で、イテレータという用語と同じ意味で使用されているカーソルという言葉を見ました。しかし、彼らは同じこととして扱われているようには思われません。カーソルとイテレータのパターン

私にとって、イテレータは、コンテナ自体を知らなくてもコンテナの反復を可能にします。一方、カーソルは、コンテナの反復も可能にしますが、コンテナのタイプに固有の実装の詳細があるため、コンテナへの参照を保持します。さらに、カーソルのインタフェースは、ファサードパターンのようなコンテナのインタフェースを反映しています。だから、基本的に、私は彼らの依存関係や、彼らが反復コンテナの知識に基づいてイテレータとカーソル間の区別をし

class Book {}; 

class Library 
{ 
    std::vector<Book> books; 

    bool IsBookHardCover(int bookIndex); 
    bool IsBookSoftCover(int bookIndex); 

    BookCursor GetFirstBook(); 
}; 

class BookCursor 
{ 
    std::vector<Book>& books; 
    int currentBook; 

    bool IsHardCover(); 
    bool IsSoftCover(); 

    void Next(); 
}; 

:ここ

は、私は、カーソルを検討するものの一例です。これは適切な区別ですか?そうでない場合は、上のコード例で概説した設計パターンをどう思いますか?

上記の私のコード例は、私がそれをコンパイルしなかったので擬似コードとして扱われなければならず、また、必要なコンストラクタもないことに注意してください。

+2

多くの場合、イテレータは反復処理中のコンテナを認識します。違いはクライアントコードのように見えます。クライアントコードでは、イテレータはイテレータインターフェイスのみを表示し、カーソルはカスタムコンテナの特定の実装の詳細を公開します。 –

+0

この "カーソル"の定義はどこで手に入りましたか? –

+1

カーソルパターンは、イテレータを逆参照することによっては達成できないものは何ですか?さらに、イテレータ実装(必要に応じて)は反復処理中のコンテナに関する情報を知っていなければなりませんが、反復子の操作はイテレータの機能を知るだけで、下位のコンテナは何も知りません。 –

答えて

6

説明したカーソルパターンは、プロキシとイテレータの2つのパターンの組み合わせです。標準ライブラリが異なる理由は、これら2つの動作を不必要に結合することを避けるためです。

1

ウィキペディアは、Iterator Patternのページへのカーソルのパターンをリダイレクトします。そのことを念頭に置いて、私はあなたが髪を分割していると言いたいと思います。ウィキペディアを決定的な基準と見なすならば、この2つの用語は同じ意味で使用できます。

+2

もし私がウィキペディアが「すべてのものを終わらせる」リソースであると思ったら、ここでそれについて尋ねることはありません。私が記述したパターンは何かです。それがカーソルのパターンでないなら、私はそれが何であるか知りたいです。 –

+5

TBH the Four of Gang of "Design Patterns"本では、イテレータパターンは「Cursor」とも呼ばれています。 – piatek

0

イテレータ(少なくともC++標準で定義されている方法)では、基になるコンテナのプロパティにアクセスすることはできませんが、これらの詳細は異なるイテレータカテゴリ(iterator_tagsからアクセス可能) 。

あなたの例に欠陥があるとも思います。格納された値にアクセスしてそのプロパティを照会すると、データのコレクションがデータのインターフェイス(たとえばIsHardCover())を反映するのはなぜですか?

0

従来、用語デザインパターンが使用されるよりずっと前に、イテレータよりも強力なものが、より大きなものに拡張され、基礎となるデータ構造を変更することができました。 いくつかの実装では、複数のカーソルが同じコンテナで動作し、操作について互いに通知することができました(当時の安定イテレータ、または安定したイテレータと呼ばれていました) )

関連する問題