我是 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 来公开您的内部集合?