イテレータパターンの理解度チェック

このQ&Aのポイント
  • イテレータパターンとは、デザインパターンの一つであり、データを順次にアクセスする方法を提供するパターンです。
  • 具体的には、データを保持するクラス(Concrete Collection)と、データを走査するクラス(Concrete Iterator)があります。
  • また、Iterator Interfaceを実装することで、異なる走査方法を選択することができます。Iteratorパターンは、大容量のデータを効率的に処理する際に活用されます。
回答を見る
  • ベストアンサー

イテレータパターンの理解度チェック

デザインパターンのイテレータパターンを勉強していて、自分の理解が正しいか気になるので質問です。以下、私の理解しているつもりのことです。正しいか否か、間違っている場合はその部分について解説を願いたいです! ・Concrete Collectionはデータの保持と管理しているクラスで、メソッドiteratorでIteretor型のオブジェクトさえ返せば、あとは使うConcrete Iteratorを用途にあわせて自由に選べたり、いろいろいじれる(?) ・Concrete Itteratorは走査方法で、昇順のそれや、降順のそれ、とびとびのそれなど事前に作っておいて、Concrete Collectionでどれを使うか選べる。それらの各クラスは完成されてて、不用意にさわってはいけない(?) ・Iterator Interfaceは、いろんな方法がある「走査」の代表のようなもので、Concrete Collectionのiteratorメソッドで返すのはどんなConcrete ItteratorでもこのIterator Interfaceの型にしておけば、Mainクラスなどから使う時、内部の余計なことを気にせずに使える。 ・Collection(Agrigate) Interfaceが何のためにあるか理解できません。どう役に立っているのか分かりません。 ・これは私の経験不足ですが、Interfaceについてあまり利用価値が分かりません。実際、どんな時Interfaceあって良かったと実感されますか? ・Iteratorパターンは、大容量をテキストを一文ずつ取り出すときなど、大きな量の配列などを一気に読むと重いので全部取り出さず使う分だけ取り出したりバックグラウンドで順次読んだりという時に使う。 ・Iteratorパターンを、実際どんな時に使われましたか?また、こういうときに使うべきという具体的な例を挙げてください。 宜しくお願いします。

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.1

ずばり言うわ。 あなた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内部でどんな風にデータを持っていようと 気にせず利用できるし、それぞれが提供する方法で 順番に要素にアクセスすることができるの。 便利よね。 -つづく-

e271828
質問者

補足

先日はどうもです。詳しくお答えいただけて大変嬉しい限りです!さて、私は理解してないということが判明してしまいました。駄目なりにもなんとか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で定めたのから変えず、中身だけを・・・ということでしょうか。例えばあとでどう実装を変えるのでしょう。 よろしくお願いします!

その他の回答 (1)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

> Collection(Agrigate) Interfaceが何のためにあるか理解できません。どう役に立っているのか分かりません。 そもそもあなたはInterfaceの価値がわかっていない? Interfaceが同じということは 内部の実装がどう変わっても利用者からは何も変更する必要がない ということよ。 例えばlogin(String id, String pass)というメソッドを実装したとするわ。 ユーザはidとパスワードを渡すだけでいいの。 その内部がデータベースにアクセスして認証をしているかもしれない、 ファイルを見ているのかもしれない、 実は何もチェックしていないかもしれない、 そんなのはユーザは知らなくても言いわけ。 ユーザはidとパスワードを渡したらログインできる ということが重要であって、内部はどうでもいいのよ。 これが実装(Concrete)とinterfaceを分ける意味ね。 最初にinterfaceさえ決めてしまえば あとでいろいろな機能を持つ実装を提供しても 利用者は何も変更する必要がないってわけ。 便利でしょ? > 実際どんな時に使われましたか 標準のAPIで用意されたものを使うくらいしかないわね。 でもIterator#nextとかはしょっちゅう使うわよ。 どんなときに使うともいえず どんなときにでも使うっていうくらいね。 長くなってしまってゴメン。 わからないことがあったら追加でよろしくね。 追記に気づいたら答えるわ。

e271828
質問者

お礼

あれから他のパターンを勉強していくうちに、客観的にイテレータパターンやインターフェースについて理解が深まってきました。 大変丁寧な回答で大いに参考になりました。どうもありがとうございました!

関連するQ&A

  • Javaのパッケージについて

    パッケージはクラスを複数管理するものと学習したのですが、 インタフェースも管理できるのでしょうか? Iteratorインタフェースを使ったプログラムを見ていますが、classの宣言のところでimplementsと書かずにhasNext()メソッドを使っているので、気になりました。 よろしくお願いします。

    • ベストアンサー
    • Java
  • RubyでJavaのInterfaceに相当するものはありますか?

    RubyでJavaのInterfaceに相当するものはありますか? Ruby 上で Javaの interface のようなものものを実現するには、どうしたらよ いのでしょうか? Rubyは型を宣言しないので機能的には interface は不要ですが。 クラスを実装する人に、あるクラスに実装しなければいけないメソッドを伝える (強制する)目的としての interface 的な使い方をしたいのです。 宜しくお願いいたします。

  • コレクションクラスの使い分け方

    プログラミング初心者です。 コレクションクラスについて勉強中ですが、 1:ArrayListクラス(Listインターフェース) 2:HashSetクラス(Setインターフェース) 3:HashMapクラス(Mapインターフェース) 4:Vectorクラス 5:Iteratorインターフェース これらの違いがよく分かりません。 <質問1> 1と2の違いは、 1:順序付けて、重複オブジェクトを保持する 2:順不同で一意のオブジェクトを保持する というところまでは分かりました。 これらと3・4の違いって何でしょうか? <質問2> 5:ポインタを前後に動かすような感じで、保持したコレクションの中身を操作できる、 ということだと思いました。 1~4まででも、要素(インデックス)を指定しれやれば、中身を操作することはできると思うのですが、これを使ったほうがどのように便利なのでしょうか? 初歩的な質問で申し訳ありませんが、具体例などを示して教えていただければ助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Eclipseで例えば↓のようなInterfaceをimplement

    Eclipseで例えば↓のようなInterfaceをimplementsしているクラスの一覧を調べたいといったような時に一覧を出す方法はあるでしょうか? (クラスだったら、コンストラクタで「呼び出し階層を開く」でいけるとおもうのですが) public interface Interface{}

    • ベストアンサー
    • Java
  • java ソート

    java ソート ソートプログラムを作ってみましょう ? double型の配列とメソッドを持つクラスを定義 ? コンストラクタで配列を初期化(0.0で初期化) ?配列を昇順,降順に並び替えるメソッドを持つこと ? 2種類のメソッドを持っても良い ? 引数の値で変えても良い ? ソート済み配列をチェックするメソッドを持つこと ? 1000000要素程度のソーティングで時間計測 課題です 全く手が出せず困ってます・・・。 ヒント、手順、解答 なんでも良いので、救いの手をお願いします!!

  • [クラス名].[メソッド名].[メソッド名]という書き方。

    javaを勉強している者です。 少しピンと来ない書き方があるのですがそれはタイトルの通りの書き方で、具体的には Main.getMailStore().isNewMail() という書き方です。MailというのがクラスでgetMailStore()というのがそのクラスで宣言されているメソッドで下記のように実装されています。(MailStoreというのはインターフェースとして別のファイルで宣言されています。) private static MailStore _mailStore; public static MailStore getMailStore(){ return _mailStore; } (MailStoreというインターフェースの中にisNewMailというメソッドは宣言されています。) public interface MailStore{ public boolean isNewMail(String uid); } これらだと、最初のMain.getMailStore().isNewMail()というのは、 「まず、MainクラスのgetMailStoreメソッドを呼び出して、そこでreturnされてくるMailStore型のクラスの中の、isNewMailメソッドを呼び出している」というのを一回で書いてしまっている書き方ということで合っているでしょうか?少しピンと来ないので・・(特にreturnされるメソッド(getMailStore)にそのまま.[メソッド]という書き方をのっけるあたりが) よろしくお願いします。

    • ベストアンサー
    • Java
  • アブストラクトとインターフェースの簡単な一例文

    JAVAについて質問よろしくお願いします。 abstract抽象クラスとインターフェースについて下記理解なのですが、超かんたんな一例など欲しいのですが何かないでしょうか。たとえば package round1.chapter1; public class Helloworld { public static void main(String[] args) { System.out.println("こんにちは!"); } } というような一文です。 ~私の理解~ アブストラクトとは、違ったクラス内で同一メソッドがある場合は親クラスに置き、違ったメソッドがある場合は抽象クラスとして親クラスに置いて、実装はサブクラスに任せるという形式で使われる言葉 インターフェースとは、機能だけを仕様書として書いておき、定義されたとおりのメソッドを実装しないといけないという呼び出し方の統一を図る際に使われるメソッド置き場 ~~~~~ このふたつについてものすごく簡単な使用例を頂きたいです。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • __interfaceに定義するメソッドについて教えてください!

    __interfaceに定義するメソッドについて教えてください! 描画エンジン(engine.dll)を作成しているのですが、アプリ(App.exe)からは呼んで欲しくないメソッドをインターフェイスに定義する必要があり困っています。具体的には、以下のDrawメソッドになります。 // 形状インターフェイス[engine.dll] __interface IShape { bool Draw(); // ★CRenderクラスから呼ばれる bool SetPos( int x, int y ); }; // 描画クラス[engine.dll] class CRender { bool DrawShape( IShape* pShape ); // pShape->Draw();をする }; // アプリ[App.exe] CRender* pRender = new CRender(); IShape* pShape = new CPolygon(); pShape->SetPos(100, 100); pRender->DrawShape( pShape ); DrawメソッドはCRenderが呼ぶメソッドなので、アプリには公開しなくてもよいメソッドになっています。公開する必要がないので、隠蔽するのが正しいと思っていますが、良い案がございましたらご助言ください。

  • Strategyパターンを用いた実装について

    Strategyパターンを用いた実装について 現在Javaを勉強しており、 Strategyパターンを用いた以下の実装を考えています。 public class UseStrategy { private Strategy strategy; public void doSomthing(int num) { switch (num) { case 0: strategy = new AlphaStrategy(); break; case 1: strategy = new BetaStrategy(); break; case 2: strategy = new GammaStrategy(); break; } // 変数strategyを用いて処理を続行していく // ... } private interface Strategy { public abstract void method_1(); public abstract void method_2(); } private class AlphaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } private class BetaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } private class GammaStrategy implements Strategy { @Override public void method_1() { //do something } @Override public void method_2() { //do something } } } つきましては、以下ご質問させてください。 (1)Strategyパターンの実装において、  上記UseStrayegyクラスのように、あるクラスの入れ子クラスとして  Strategyインターフェース及び、その実装クラスを実装する方法は  普通でしょうか?    それとも、入れ子クラスとしてではなく、Strategyインターフェース、  その実装クラスを全て 別クラスファイルに分けた方が良いのでしょうか? (2)例として、  BetaStrategy.method_2()とGammaStrategy.method_2()の処理が全く  同じだったとします。その場合、共通となる処理を一つのメソッド化し、  そのメソッドをBetaStrategy.method_2()とGammaStrategy.method_2()から  コールしたいと考えております。  その際、共通となる処理メソッドの実装箇所としては、以下のいずれが良いのでしょうか。   (A)Strategyインターフェースを抽象クラス化し、二つの共通処理メソッドを実装する。  (B)UseStrategyクラスに、共通処理を実装する。    それとも、上記の様なケースがある場合Strategyパターンは不適切でしょうか。 文面に分かりづらい面や、Javaのオブジェクト指向・デザインパターンについて 理解の乏しいところがあるかと思いますが、ご回答の程よろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう