ちゃんなるぶろぐ

エンジニア5年生🧑‍💻 オライリーとにらめっこする毎日。

【5分でわかる📚】TypeScriptで学ぶDesign Pattern〜Iterator Pattern〜

どうも、ちゃんなるです!

今回は、ソフトウェア開発において便利なデザインパターンの1つ、Iterator Patternを取り上げます👍

概要

Iterator Patternは、コレクション内の要素を順次アクセスする方法を提供するデザインパターンです。

コレクションの内部構造を明らかにせずに、要素を反復処理するための統一されたインターフェイスを提供します。

統一されたインターフェイスは2つ。

  • next():次の要素を返す
  • hasNext():次の要素があるかどうか確認する

これにより、コレクションの実装が変更された場合でも、クライアントコードを修正する必要がなくなり、柔軟なプログラム構造が実現できます👍

今回示すサンプルプログラムの設計

Iterator Patternを用いて、本とその著者の情報が格納された本棚を表現するプログラムを作りましょう📚

サンプルコード

interface Iterator {
  next(): any;
  hasNext(): boolean;
}

class Book {
  constructor(private title: string, private author: string) {}

  getTitle(): string {
    return this.title;
  }

  getAuthor(): string {
    return this.author;
  }
}

class BookShelf {
  private books: Book[] = [];

  addBook(book: Book): void {
    this.books.push(book);
  }

  getBookAt(index: number): Book {
    return this.books[index];
  }

  getIterator(): Iterator {
    return new BookIterator(this);
  }
}

class BookIterator implements Iterator {
  private index = 0;

  constructor(private bookShelf: BookShelf) {}

  next(): Book {
    return this.bookShelf.getBookAt(this.index++);
  }

  hasNext(): boolean {
    return this.index < this.bookShelf.length;
  }
}

クラス図

サンプルコードをクラス図で表すとこうなります。

サンプルコードのクラス図:Mermaid Live Editorで作成

このクラス図は、本棚(BookShelf)と、本棚の中の本を順番に見るための道具(BookIterator)について説明しています。

  • Iterator: 道具の基本形。順番に要素を見ることができるかどうかを教えてくれるhasNextと、次の要素を見るためのnextという機能を持ちます。
  • BookIterator: 道具の具体的な形。どの本を今見ているかを示すindexと、本が入っている本棚bookShelfがあります。
  • BookShelf: 具体的な本棚。本が入っているbooksがあります。本棚から道具を取り出すためのgetIteratorという機能があります。
  • Book: 本の情報を持つクラス。タイトルと著者を取得するためのgetTitlegetAuthorという機能があります。

本棚と道具は基本形(Iterator)と具体的な形(BookIterator)がありますが、基本形から具体的な形になるように繋がっています(矢印で示されている)。本棚を使って道具を取り出し、その道具で本棚の中の本を順番に見ることができます。

イテレータパターンの使い道

Iterator Patternは、以下のような典型的なシナリオで役立ちます。

  • コレクションの内部構造を隠蔽しながら、要素に順次アクセスしたい場合
  • コレクションの実装が変更されても、クライアントコードに影響を与えないようにしたい場合

組み合わせられるデザインパターン

例えば、Composite PatternやVisitor Patternと組み合わせて使うことが一般的です。

chan-naru.hatenablog.com

chan-naru.hatenablog.com

まとめ

Iterator Patternは、「集合体の要素を、統一した方法で一つ一つ処理していくパターン」です👍

イテレータパターンを使うことで、様々な種類のコレクションから要素を取り出す方法をシンプルに統一できます。これにより、コードの再利用性や拡張性が向上し、プログラムのメンテナンスもしやすくなります。

デザインパターンを学ぶことで、より効率的で柔軟なソフトウェア設計ができるようになります。イテレータパターンはその一つであり、日々のプログラミングで役立つこと間違いなしです💪

参考文献

それでは、皆さんがIterator Patternを自信を持って活用できることを願っています! 今後も技術情報をお届けするブログをお楽しみに✌️