c# - C# 中的 Object Calisthenics First Class Collection 规则示例?
问题描述
我正在使用 Object Calisthenics 规则,但在使用 C# 时,我在查看何时使用第一类集合时遇到了一些麻烦。
我的意思是我几乎看不到它应该在什么时候使用,例如,很难将该规则应用于 EF DbContext
。
假设我们设计了一个 Board 类。
public class Board
{
public IList<BoardRow> Rows { get; }
public IList<BoardColumn> Columns { get; }
public Board()
{
Rows = new List<BoardRow>();
Columns = new List<BoardColumn>();
}
}
所以根据这个规则,我们必须把上面的代码变成:
// Is it really that better than just using List<BoardRow>?
public class BoardRowCollection : IEnumerable<BoardRow>
{
public void Add(BoardRow row) { /*...*/ }
public void Remove(BoardRow row) { /*...*/ }
// IEnumerable<BoardRow> Impl goes here...
}
// Is it really that better than just using List<BoardColumn>?
public class BoardColumnCollection : IEnumerable<BoardColumn>
{
public void Add(BoardColumn column) { /*...*/ }
public void Remove(BoardColumn column) { /*...*/ }
// IEnumerable<BoardRow> Impl goes here...
}
public class Board
{
public BoardRowCollection Rows { get; }
public BoardColumnCollection Column { get; }
// Rest of the impl, ctor, etc.
}
当您已经拥有可以用来实现您的目标的基类时,我不确定是否明白这条规则的重点。
也许上面的代码不是最好的,但我希望看到一个可以阐明该规则目的的示例。
解决方案
背景
假设您有一个类Foo
,并且出于任何原因它需要Rows
来自Board
.
现在Foo
需要在 中找到第 5 项Rows
。几天后你需要一个类Buu
,它应该在Rows
.
两者Foo
都有Buu
自己的实现,用于如何在Rows
.
// ...
Foo foo = new Foo(board.getRows());
Buu buu = new Buu(foo.getRows());
BoardRow row5 = foo.find5thRow();
BoardRow row8 = buu.find8thRow();
只有 Collection 本身应该知道如何对其进行操作
从对象健美操:
这条规则的应用很简单:任何包含集合的类都不应包含其他成员变量。每个集合都包装在自己的类中,因此与集合相关的行为现在有了一个家。您可能会发现过滤器成为这个新类的一部分。此外,您的新类可以处理诸如将两个组连接在一起或将规则应用于组的每个元素等活动。
如果我们要为 Rows 创建一个 First Class Collection,我们可以将它的一个实例传递给Foo
并Boo
调用它的一个方法:
class Foo {
RowCollection rowCollection;
// constructor and more ...
public BoardRow find5thRow() {
rowCollection.findByIndex(5);
}
}
概括
First Class Collection 应涵盖创建、读取、更新、删除、过滤、合并等操作。传递一个 First Class Collection 的实例,而不是它自己的集合。优点是您只需将方法委托给您的 First Class Collection,而不是编写操作的新副本。
推荐阅读
- ios - 默认详细视图 uisplitview
- maven - (org.mule.api.transformer.TransformerException)
- python-3.x - ImportError:无法导入名称“评估”(来自意外导入评估)
- amazon-web-services - Lambda 上的 AWS SES - 无法(静默)发送电子邮件
- python - Tkinter 标签在时间睡眠后没有出现
- google-drive-api - 如何恢复永久删除的谷歌驱动器文件
- javascript - 如何从导航选项中的文本输入更新本机组件的状态?
- recursion - c中的递归函数有问题
- vba - 循环中的 VBA 变量 - BlueZone 仿真
- terraform - 未使用 Terraform 和 vSphere 重新创建的资源