1

私は 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 を実装して内部コレクションを公開したいのはいつですか?

4

1 に答える 1

0

IEnumerableおそらく良い選択でしょう。オブジェクトのプライベート リストを作成し、Employeeそれを として公開してIEnumerable、人々がループや LINQ などで使用できるようにすることができます。

IEnumerable反復されるコレクションを変更することはできないため、内部の変更の消費者について心配する必要はありませんEmployeeList

反復メソッドを提供することは理想的ではありません。なぜなら、それはPOLAを壊し、呼び出したいメソッドを見つけるために API を使用するプログラマーにいくらかの努力を必要とするからです。考えてみれば、次のようなコードは .NET にはありません。

var list = new List<T>;
foreach (var item in list.GetAllItems())
{
    // Whut? 
}
于 2013-10-17T16:44:16.867 に答える