私は Jeff Bay の Object Calisthenics エクササイズのファンです。
http://www.xpteam.com/jeff/writings/objectcalisthenics.rtf
そして、コレクションの実装とオブジェクトのコレクションに対する反復の両方をカプセル化するオブジェクトを作成することにより、ファーストクラスのコレクションを実装することで良い結果が得られました。
これは、List の代わりに EmployeeList オブジェクトがあることを意味します。
通常、これらのオブジェクトを作成するときは、コレクション インターフェイスを実装しないため、外部ユーザーは内部コレクションを列挙できません。これが重要だと思ったからです。しかし、ある同僚は反対のことを提案していました - ICollect インターフェイスを実装して、より柔軟にします。
内部コレクションへのアクセスを完全に削除するわけではありませんが、このリファクタリング サイトは同じ方向にあるようです: http://sourcemaking.com/refactoring/encapsulate-collection
// Foreach method
foreach (var employee in employees)
{
if (employee.IsManager)
{
managers.Add(employee);
}
}
// Linq method
managers = employees.Where(e => e.IsManager);
// Encapsulated iteration method
managers = employees.GetAllManagers();
public IEnumerable<Employee> GetAllManagers() // Inside Employees class
{
return employees.Where(e => e.IsManager);
}
最後の方法が有利であると言うのは正しいですか?たとえば、IEnumerable を実装して内部コレクションを公開したいのはいつですか?