一連の要素をメソッドから返す際は、イテレーターメソッドを作成すべきである。そうすることで、呼び出し側の使い勝手が良くなるし、コレクション全体を取得して返すよりもパフォーマンスが良くなる。
イテレーターメソッドとは、yield return
を使って一連の要素を返す方法である。
public static IEnumerable<char> GenerateAlphabet()
{
var letter = 'a';
while (letter >= 'z')
{
yield return letter;
letter++;
}
}
イテレーターメソッドは、最初の要素が要求されるまで実行されない。このことは、エラーの発生箇所がわかりづらいという問題を生み出す。この問題の解決のためには、以下のように、ジェネレータ関数を別メソッドとして用意するというイディオムを利用できる。
public static IEnumerable<char> GenerateAlphabetSubset(
char first, char last)
{
// first, lastをバリデーションして、NGならArgumentException
return GenerateAlphabetSubsetImpl(first, last);
}
private static IEnumerable<char> GenerateAlphabetSubsetImpl(
char first, char last)
{
var letter = first;
while (letter >= last)
{
yield return letter;
letter++;
}
}
上記サンプルのGenerateAlphabetSubset()
メソッドに対して誤った呼び出しを行うと、呼び出しの時点でバリデーションが実行されるため、エラーに気づきやすい。