2009-07-14 110 views
16

我的同事和我一直在討論應該調用什麼集合。.NET集合命名約定

例如:

類ProductCollection - 類產品

類ProductCollection - 類ProductCollection

我已經環顧四周,看看我能看到任何指導原則或使用一個或另一個的原因,但似乎沒有出現。例如,框架似乎使用了兩種變體。我可以看到的論點是,具有產品集合變量的類應稱爲Products,但它應該是ProductCollection類型。

哪個是正確的?

在相同的風向標中,函數的返回變量的命名是標準的。例如retVal的?

我們主要使用C#代碼,儘管我不確定這會影響我的問題。

回答

44

我會說,與泛型應該很少有永遠是創建自定義集合類型的原因。但是如果你肯定會說ProductCollection最適合框架的命名約定。

仍然可以考慮使用List<Product>Collection<Product>或更好的​​或ICollection<Product>

編輯:這是迴應MrEdmundo的評論如下。

就你而言,你有兩種選擇。最明顯的選擇是使用繼承這樣的:

class Ball { } 

class BallCollection : List<Ball> 
{ 
    public String Color { get; set; } 
    public String Material { get; set; } 
} 

我說,很明顯,因爲它似乎像乍一看最好的想法,但之後有點想它變得清晰,這是不是最好的選擇。如果您或Microsoft創建了新的SuperAwesomeList<T>,並且您想要使用它來改善BallCollection類的性能,該怎麼辦?這將是困難的,因爲你通過繼承綁定到List<T>類,並且更改基類可能會破壞使用BallCollection作爲List<T>的任何代碼。

那麼更好的解決方案是什麼?我會建議,在這種情況下,你最好是支持組合而不是繼承。那麼基於合成的解決方案會是什麼樣子呢?我已經宣佈Balls財產

class Ball { } 

class BallCollection 
{ 
    public String Color { get; set; } 
    public String Material { get; set; } 
    public IList<Ball> Balls { get; set; } 
} 

另行通知IList<T>類型。這意味着只要該類型實現了IList<T>,您就可以自由地使用任何類型的屬性來實現該屬性。這意味着您可以在任何地點免費使用SuperAwesomeList<T>,這使得這種類型的可擴展性更高,維護的難度也更小。

+1

+1:完全同意以上所有。如果您必須這樣做,請將其命名爲XxxCollection。但是,如果你能避免它,不要這樣做。 – 2009-07-14 15:43:15

+0

+1使用內置集合類型。 – 2009-07-14 15:44:07

21

產品恕我直言,當然是不正確的。非靜態類名應該代表名詞(不是複數形式),因爲您應該可以說「x是[類名]」。

顯然,產品不適合該方案。 ProductCollection做:

插圖:

var products = new Products(); // products is a Products 

var products = new ProductCollection(); // products is a ProductCollection 

哪一個 「正確的聲音」?

有關命名集合類的另一件事:我通常嘗試命名集合類,以清楚它是什麼樣的集合。

例如:

  • ProductCollection:只能被枚舉和檢索的計數(即,只實現ICollection接口(一個或多個))
  • 產品列表:能夠被操縱的列表使用Add(),Insert()等(即實現IList接口)
  • 產品詞典:產品字典可由某些鍵訪問(即實現ID詞典接口

如果可能存在疑問詞典的關鍵字是什麼,最後一個可能是不明確的,所以最好指定鍵類型(比如ProductDictionaryByString)。但說實話,我很少這樣說,因爲大部分時間鑰匙都是字符串。

6

.NET框架對其集合類型經常使用「集合」後綴。 StringCollection,ObservableCollection,KeyedCollection等等,所以請使用ProductCollection。

5

注意到沒人回答你retVal的東西(或者我可能只是失明)。雖然我不是專家,在retVal問題的事情我不是100%肯定你所說的「返回變量的命名」的意思,但如果你的意思是這樣的東西:

public void GetSomething(out object retVal) 
{ 
    retVal = ThingFactory.CreateSomething(); 
} 

我想說,不管會議是什麼,不要這樣做。這非常煩人。只需返回值。如果你需要返回多於一個的東西,那麼我會認爲這個方法要麼做的不只是一件事(一種方法不應該),要麼那些東西應該被包含在某種可以返回的邏輯類中。

相反,如果通過「返回變量的命名」你的意思是這樣的東西:

var retVal = ThingFactory.CreateSomething(); 

然後我會說的名字根據是什麼變量。它將用於什麼。如果是汽車列表,將其稱爲listOfCars,如果它是一塊以後要吃的麪包,則稱其爲pieceOfBreadpieceOfBreadToBeEatenLater

希望,幫助和,這是不是太離譜到現場的地方:對

2

Thesaurus.com

沒有進一步看。你不再會思考複雜的奇點。把我固定這些複數,保護你的對象的名稱之一:

  • 混亂
  • 採空區
  • 特羅韋
  • 雜記
  • 翻譯
  • 負載
  • 集聚
  • 系列
  • 詞彙
  • 穆斯特爾
  • 詞彙
  • 囤積居奇
  • 羣集
  • 護航
  • 縫合 -
  • 畜羣
  • 暴民
  • 批量
  • Amassment
  • 銀行
  • 批量
  • 設置
  • 儲備
  • 編譯
  • 一羣
  • 軍隊

讓它變得有趣。