[英]C# property of type IEnumerable
我有一個名為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
以使內部框架僅使用不可變版本,還是會因為“您的內部代碼不夠愚蠢而無法在以后更改查詢”而拒絕這樣做?
其他一些上下文:用戶實例化一個新的容器查詢,並希望添加一些子句。 沒有時髦流暢的界面或類似的東西。 將完成的查詢傳遞給我的框架后,我的框架只希望讀取所有子句,並且不允許對其進行任何更改(按接口描述)。
從以下實現開始。 為什么? 它為呼叫者提供了最少的知識和可能性。
如果您可以接受實施,那么您就完成了。 如果您認為沒有子句的ContainerQuery沒有意義,請將其添加到構造函數中,以便調用者被迫提供一個值。 如果建議調用者使用此接口,則需要ICollection中的某些方法(在構造ContainerQuery之后添加/刪除)。 等等 ...
public class ContainerQuery : IContainerQuery
{
public ContainerQuery()
{
Clauses = new List<ContainerQueryClause>();
}
public IEnumerable<ContainerQueryClause> Clauses { get; private set; }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.