我有一个名为的小实用程序类ContainerQuery
,它由零个或多个ContainerQueryClause
对象组成。在用户准备好查询后(即添加了一些子句),我的框架的接口需要获取一个支持的对象:
interface IContainerQuery
{
public IEnumerable<ContainerQueryClause> Clauses { get; }
}
什么是最好的实现IContainerQuery
,为什么?
选项 a)
class ContainerQuery
{
public IEnumerable<ContainerQueryClause> Clauses { get; set; }
}
选项 b)
class ContainerQuery
{
public ContainerQuery()
{
Clauses = new List<ContainerQueryClause>();
}
public ICollection<ContainerQueryClause> Clauses { get; private set; }
}
选项 c)
class ContainerQuery
{
public ContainerQuery(IEnumerable<ContainerQueryClause> clauses)
{
Clauses = clauses;
}
public IEnumerable<ContainerQueryClause> Clauses { get; private set; }
}
选项 d)
上述方法的组合或完全不同的方法。
旁注1:虽然ContainerQuery
目前看起来像“它是一个可枚举的子句”,但我想为将来建模它,因为“有一个可枚举的子句”。
问:是否有创建类型属性的一般最佳实践/模式IEnumerable<T>
?如果不是,哪种方法适合哪种情况?
附带问题:您会创建接口IContainerQuery
以使您的内部框架仅使用不可变版本,还是会因为“您的内部代码不够愚蠢,以后无法更改查询”而避免这样做?
一些额外的上下文:用户实例化一个新的容器查询并想要添加一些子句。没有时髦流畅的界面或类似的东西。将完成的查询传递给我的框架后,我的框架只想读取所有子句,并且不允许对其进行任何更改(根据接口描述)。