gof-iterator について
gof-iteratorは、カスタムコレクションの設計や異なる構造の統一的な走査に向けて、イテレーターパターンを解説します。データの管理と走査を分離し、内部表現を公開せずに要素へ順番にアクセスできます。
主な機能
- 01集合と走査の役割を分離
- 02要素への順次アクセス
- 03イテレーターごとの位置管理
- 04標準インターフェースへの準拠
活用シーン
- 01配列、ハッシュマップ、リストの統一走査
- 02ツリーやグラフの走査機能の実装
- 03内部の集合型への依存の回避
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ yonatankarp/ software-design-skills --skill gof-iteratorインストール後、Claude Code で/gof-iteratorを入力して読み込まれたか確認します。
詳細
1 行での要約
集約オブジェクトの内部表現を公開せずに、その要素に順番にアクセスする方法を提供します。
このスキルを使用する場面
- 異なる内部構造を使う複数の集約型(配列を使うもの、ハッシュマップを使うもの、連結リストを使うもの)を、統一的にたどる必要がある場合。
- コレクションを消費するメソッドが、具体的なコレクション型に依存すべきでない場合。
- クライアントコードからたどれるカスタムコレクション(ツリー、グラフ、ページネーションされたリモートデータセット)を実装する場合。
このスキルを使用しない場面
- 言語に標準コレクションの反復処理機能がすでに備わっていて(現在の言語にはすべて備わっています)、カスタムコレクションを設計するわけではない場合は、その言語の
for-each/反復処理を使用してください。 - 「反復処理」が実際には変換やフィルタリングのパイプラインである場合は、より高レベルの概念なので、その言語のストリーム/シーケンスを使用してください。
- 順次アクセスではなく、ランダムアクセス が必要な場合。Iterator は定義上、順次アクセスを行います。
主な内容
このパターンでは、次の 2 つの関心事を分離します。
- Aggregate はデータを所有し、その内部構造を把握します。
- Iterator はその構造を一度に 1 つずつたどる方法を把握します。
Aggregate は通常 iterator() というメソッドを提供し、新しい Iterator を返します。Iterator は標準インターフェース(hasNext()、next()、場合によっては remove())を実装します。
同じ Aggregate に対して複数のイテレーターを同時に作成でき、それぞれが独自の位置を追跡します。だからこそ、反復状態は Aggregate ではなく Iterator に属します。
このパターンは非常に基本的なものであり、ほぼすべての現代的な言語で、言語や標準ライブラリに組み込まれています。Kotlin、Java、C#、Python、Swift、Rust、JavaScript のいずれにも、Iterator または Iterable インターフェースと、それらを処理する for ループがあります。
判断のヒント
- 組み込みのコレクションでは、独自の Iterator を作らないでください。言語に備わっています。
- カスタムコレクションやストリームを設計するときは、その言語の標準 Iterator インターフェースを実装し、クライアントコードが慣用的な反復処理(Kotlin の
Iterableに対するfor、Java のfor-each、Python のfor x in y)を使えるようにしてください。 - フィルタリングや変換を伴う一度限りの走査には、状態を持つイテレーターよりもストリーム/シーケンスを優先してください。
アンチパターン
- 内部コレクション(
getInternalList())を公開し、呼び出し元に直接反復処理させること。カプセル化が損なわれ、呼び出し元が具体的な型に依存することになります。 - 集約が許可していない方法で、走査中に集約を変更するイテレーター。通常、同時変更による不具合の原因になります。
- 言語の標準インターフェースに準拠しないカスタムイテレーター。クライアントコードに独自のパターンを強いることになります。
関連項目
gof-composite— Iterator は Composite 構造をたどる自然な方法です。gof-kotlin-idioms—Sequence、Iterable、Iterator<T>インターフェース、およびiterator { yield(x) }ビルダーが標準機能として用意されています。独自のイテレータークラスを作るのが適切な場面はほとんどありません。
参考文献
- Head First Design Patterns(第 2 版)、第 9 章(「適切に管理されたコレクション:Iterator パターンと Composite パターン」) — 異なるデータ構造に保存されたメニューを 2 軒のレストランが統合する例を軸に解説した、定番の章です。
コメント
Markdown 対応