質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.54%

  • Java

    15532questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • デザインパターン

    77questions

    デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。

GoFのイテレータパターンが、インターフェースがなくても機能を満たしてしまう

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 642

nyahonyaho

score 73

↓でGoFイテレータパターンから各インターフェースを除外し、コンパイルが通るようにしました。しかしこの状態でも、ここから集約役割(本棚)の実装が変わっても(ex.配列→ArrayList)正常に動いてしまいます。
なのでインターフェースいらないじゃんって思ってしまったのですが、オブジェクト指向設計においては必要なのですよね?その理由を教えて下さい。

//メイン
public class Main {
    public static void main(String[] args) {
        BookShelf bookShelf = new BookShelf(4);
        bookShelf.appendBook(new Book("Around the World in 80 Days"));
        bookShelf.appendBook(new Book("Bible"));
        bookShelf.appendBook(new Book("Cinderella"));
        bookShelf.appendBook(new Book("Daddy-Long-Legs"));
        //Iterator it = bookShelf.iterator();
        BookShelfIterator it = bookShelf.iterator();
while (it.hasNext()) {
            Book book = (Book)it.next();
            System.out.println(book.getName());
        }
    }
}
//数えるモノ(書籍)
public class Book {
    private String name;
    public Book(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
}
//集約役割(本棚)
//public class BookShelf implements Aggregate {
public class BookShelf {
    private Book[] books;
    private int last = 0;

    public BookShelf(int maxsize) {
        this.books = new Book[maxsize];
    }

    public Book getBookAt(int index) {
        return books[index];
    }

    public void appendBook(Book book) {
        this.books[last] = book;
        last++;
    }

    public int getLength() {
        return last;
    }

    // public Iterator iterator() {
    public BookShelfIterator iterator() {
        return new BookShelfIterator(this);
    }
}
//イテレータ役割
//public class BookShelfIterator implements Iterator {
public class BookShelfIterator {
    private BookShelf bookShelf;
    private int index;

    public BookShelfIterator(BookShelf bookShelf) {
        this.bookShelf = bookShelf;
        this.index = 0;
    }

    public boolean hasNext() {
        if (index < bookShelf.getLength()) {
            return true;
        } else {
            return false;
        }
    }

    public Object next() {
        Book book = bookShelf.getBookAt(index);
        index++;
        return book;
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

こんにちは。

GoFのデザインパターンに詳しくはないのですが、「GoFイテレータパターン」には2つのメリットがあると思います。

  1. イテレータ自体
    配列や線形リストを同じ使い方で枚挙できるので、あるコレクションの実装を変更しても使う側のプログラムを変更しなくてもよい。
  2. イテレータ・インタフェースを継承したコレクション
    これは1.の使い方で使えることを保証されるので、使いやすい。

nyahonyahoさんの実装は1.のメリットを使ってますが、2.のメリットがありません。
例えば、本棚(BookShelf)を使ったことがある人が、薬品庫(ChemicalCloset)を使う時もあると思います。その時、ChemicalClosetの実装者が、例えばgetIterator()でイテレータを返却するような実装をしていると結構嫌と思います。
逆も同じです。ChemicalClosetを使った事がある人が、BookShelfを使う時、getIterator()ではなくiterator()を使わないといけなくなります。

それよりは、IEnumeratorのようなインターフェースでiterator()を定義しておき、コレクションを実装する時はIEnumeratorを継承することにしておくと、上記問題をさけることができます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/09 12:34

    リサイクル性の基本ですね・・・ありがとうございました!

    キャンセル

+1

集約役割(本棚)の実装が複数同時に存在するとき困ります。
追加/削除可能な本棚と
追加オンリーな本棚とか
本のIdが連番になっている本棚とか

イテレータの実装が複数同時に存在するときもやっぱり困ります。
順番に取り出すとか
逆順に取り出すとか

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Java

    15532questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • デザインパターン

    77questions

    デザインパターンは、ソフトウェアのデザインでよく起きる問題に対して、解決策をノウハウとして蓄積し再利用出来るようにした設計パターンを指します。