コンテンツにスキップ

Iterator

コレクション内部構造を隠し、走査方法だけを外部へ公開するパターンです。

  • インベントリやクエスト一覧を一貫した方法で走査したいとき
  • コレクション実装変更の影響を減らしたいとき
  • Aggregate
  • Iterator
  • Client

以下のコードは、上で説明した状況を Unity プロジェクトの文脈で単純化した例です。

using System.Collections;
using System.Collections.Generic;
public sealed class InventoryCollection : IEnumerable<InventoryItem>
{
private readonly List<InventoryItem> items = new();
public void Add(InventoryItem item)
{
items.Add(item);
}
public IEnumerator<InventoryItem> GetEnumerator()
{
foreach (InventoryItem item in items)
{
yield return item;
}
}
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
  • 振る舞いを分離できるため、変更の影響範囲を小さくできます。
  • ルールの追加や差し替えを比較的安全に行えます。
  • オブジェクト数や間接呼び出しが増えると、流れを追いにくくなります。
  • 実行順序のバグはテストで固定しておく必要があります。

内部表現を露出せずに順次アクセスする流れです。

Iterator の流れ