【发布时间】:2019-05-01 07:30:30
【问题描述】:
我正在使用 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.
}
当您已经拥有可用于实现目标的基类时,我不确定是否明白这条规则的重点。
也许上面的代码不是最好的,但我希望看到一个可以阐明该规则目的的示例。
【问题讨论】:
-
对我来说,这只是一种“指南”。有时这可能很好(但我对此持怀疑态度),有时根本不是。这取决于实际用例。总的来说,这些规则对我来说看起来很可疑。 “不要使用
else关键字”? “没有属性”?我不会相信这样的指导方针。无论如何,它在很大程度上是基于意见的。 -
@dymanoid 我可以在一定程度上得到无属性规则或者不使用 else 关键字,它可以帮助执行真正的 OO 编码。但是这个属性除了重域类型(比如 DDD 中的值对象/聚合)之外。
标签: c# oop design-patterns solid-principles