- ベストアンサー
イテレータパターンの理解度チェック
- イテレータパターンとは、デザインパターンの一つであり、データを順次にアクセスする方法を提供するパターンです。
- 具体的には、データを保持するクラス(Concrete Collection)と、データを走査するクラス(Concrete Iterator)があります。
- また、Iterator Interfaceを実装することで、異なる走査方法を選択することができます。Iteratorパターンは、大容量のデータを効率的に処理する際に活用されます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ずばり言うわ。 あなたIteratorパターンまったく理解していないでしょう? ずびしっ(効果音的なもの) Iteratorパターンというのは私的に簡単に説明すると ・Collectionの要素に順番にアクセスする方法 ・しかもCollectionの中身を意識する必要はない というものよ。 Java的に言うならCollectionの要素が StringでもFormでも まったく同じ構成の実装が書けるって言うこと。 具体的なソースで書くと Iterator ite = myCollection.iterator(); while(ite.hasNext()) { } こんな感じ。 myCollectionの要素がなんだろうと 同じ実装になるでしょ? Iteratorパターンを使って何かを作ると言うことは この様な形で実装可能なCollectionを作成する ということよ。 つまり、Iteratorパターンというのは Collectionクラスの作成方法なの。 Concrete CollectionというのはCollectionの実体よ。 ListがInterfaceならArrayListやLinkedListはConcreteね。 これらにはiteratorメソッドがあるわね。 一度これらのソースを見てもらうと実感できると思うけど それぞれのConcrete Collectionには専用にConcrete Iteratorが用意されているわ。 それぞれのCollectionの要素にどのような順番でアクセスするかを それぞれ専用に決定しているわけ。 そのため、LinkedListとかArrayListとかの利用者は LinkedListがArrayList内部でどんな風にデータを持っていようと 気にせず利用できるし、それぞれが提供する方法で 順番に要素にアクセスすることができるの。 便利よね。 -つづく-
その他の回答 (1)
- askaaska
- ベストアンサー率35% (1455/4149)
> Collection(Agrigate) Interfaceが何のためにあるか理解できません。どう役に立っているのか分かりません。 そもそもあなたはInterfaceの価値がわかっていない? Interfaceが同じということは 内部の実装がどう変わっても利用者からは何も変更する必要がない ということよ。 例えばlogin(String id, String pass)というメソッドを実装したとするわ。 ユーザはidとパスワードを渡すだけでいいの。 その内部がデータベースにアクセスして認証をしているかもしれない、 ファイルを見ているのかもしれない、 実は何もチェックしていないかもしれない、 そんなのはユーザは知らなくても言いわけ。 ユーザはidとパスワードを渡したらログインできる ということが重要であって、内部はどうでもいいのよ。 これが実装(Concrete)とinterfaceを分ける意味ね。 最初にinterfaceさえ決めてしまえば あとでいろいろな機能を持つ実装を提供しても 利用者は何も変更する必要がないってわけ。 便利でしょ? > 実際どんな時に使われましたか 標準のAPIで用意されたものを使うくらいしかないわね。 でもIterator#nextとかはしょっちゅう使うわよ。 どんなときに使うともいえず どんなときにでも使うっていうくらいね。 長くなってしまってゴメン。 わからないことがあったら追加でよろしくね。 追記に気づいたら答えるわ。
お礼
あれから他のパターンを勉強していくうちに、客観的にイテレータパターンやインターフェースについて理解が深まってきました。 大変丁寧な回答で大いに参考になりました。どうもありがとうございました!
補足
先日はどうもです。詳しくお答えいただけて大変嬉しい限りです!さて、私は理解してないということが判明してしまいました。駄目なりにもなんとかaskaaskaさんの回答を読んでみました。今の私は少しは理解できているのでしょうか、また質問です。 1. 「イテレータパターンで作ってね」という場合は、 Collectionクラスに、以下のような構造を持たせてねということ Iterator ite = myCollection.iterator(); while(ite.hasNext()) { } この構造があると、Collectionの要素(例えば配列の要素がStringでもFormでも何でも)の種類に関わらず、走査できる。ここがメリット。 2. >それぞれのConcrete Collectionには専用にConcrete Iteratorが用意されているわ。 それぞれのCollectionの要素にどのような順番でアクセスするかをそれぞれ専用に決定しているわけ。 例えば、筆箱クラス、棚クラス、便せんクラスとあったとします。これら一つ一つに、専用のIteratorがあり、それはそれぞれ内包する中身に関係なく「走査する順番」だけを決めてると。 3. >Interfaceが同じということは 内部の実装がどう変わっても利用者からは何も変更する必要がない ということよ。 Interfaceが何と同じなのでしょう?また、利用者というのはどんな人を想定しておられますか?私はまだ卵以前で実務経験もないもので、とんでもないことを聞いていたらすみません。この場合どんな風に利用されているのでしょう。利用というとアプリケーション上と想像してしまい、それですと実装もなにもソースは見えないので・・・。interfaceがないとき実装が変わったら利用者は何を変更するのでしょう。また、interfaceがあるときは? 4. >最初にinterfaceさえ決めてしまえば あとでいろいろな機能を持つ実装を提供しても 利用者は何も変更する必要がないってわけ。 最初に、これとこれのメソッドを実装するとinterfaceで決めて、実装ではそれらのメソッドの詳細を記述するということですよね。あとでいろいろな機能を持つ実装というのは、そのインターフェースで決めたもの意外にもメソッドを追加するということですか?それとも、インターフェースで決めたメソッドにもっと追加機能を施すということでしょうか?後者の場合は、メソッドの引数とかはinterfaceで定めたのから変えず、中身だけを・・・ということでしょうか。例えばあとでどう実装を変えるのでしょう。 よろしくお願いします!