2

我有一个名为的小实用程序类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以使您的内部框架仅使用不可变版本,还是会因为“您的内部代码不够愚蠢,以后无法更改查询”而避免这样做?


一些额外的上下文:用户实例化一个新的容器查询并想要添加一些子句。没有时髦流畅的界面或类似的东西。将完成的查询传递给我的框架后,我的框架只想读取所有子句,并且不允许对其进行任何更改(根据接口描述)。

4

1 回答 1

0

从以下实现开始。为什么?它为调用者提供了最少的知识和可能性。

  • 您可以将类与默认构造函数一起使用 => 无需考虑参数会发生什么
  • 子句总是被初始化 => 不需要检查 null
  • 子句是 IEnumerable => 最小的功能集,内部表示的最大灵活性

如果您可以接受实施,那么您就完成了。如果您认为没有 Clause 的 ContainerQuery 没有意义,请将其添加到构造函数中,以便调用者被迫给出一个值。如果您建议调用者需要 ICollection 中的一些方法(在构造 ContainerQuery 后添加/删除),而不是使用此接口。等等 ...

public class ContainerQuery : IContainerQuery
{
  public ContainerQuery()
  {
    Clauses = new List<ContainerQueryClause>();
  }

  public IEnumerable<ContainerQueryClause> Clauses { get; private set; }
}
于 2013-09-09T08:08:09.003 回答