1

我是 Jeff Bay 的 Object Calisthenics 练习的粉丝:

http://www.xpteam.com/jeff/writings/objectcalisthenics.rtf

通过创建对象来封装集合的实现以及对象集合的迭代,我在实现一流集合方面取得了很好的成果。

这意味着我有一个 EmployeeList 对象,而不是 List。

通常,当我创建这些对象时,我不会实现任何集合接口,因此外部用户无法枚举内部集合,因为我认为这就是重点。然而,一位同事提出了相反的建议——实现 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 回答