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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

デザインパターン

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

Q&A

解決済

2回答

2196閲覧

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

nyahonyaho

総合スコア83

Java

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

デザインパターン

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

0グッド

0クリップ

投稿2017/02/09 02:43

編集2017/02/09 02:44

↓で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; } }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

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

  1. イテレータ自体

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

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

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

投稿2017/02/09 03:01

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyahonyaho

2017/02/09 03:34

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

0

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

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

投稿2017/02/09 03:25

編集2017/02/09 03:44
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問