C#:你会给一个 IEnumerable 类起啥名字?

Posted

技术标签:

【中文标题】C#:你会给一个 IEnumerable 类起啥名字?【英文标题】:C#: What would you name an IEnumerable class?C#:你会给一个 IEnumerable 类起什么名字? 【发布时间】:2009-07-14 19:21:08 【问题描述】:

在阅读this question 时,我开始有点疑惑。假设你有这两个:

class ProductCollection : ICollection<Product>
class ProductList : IList<Product>

IEnumerable&lt;Product&gt; 会叫什么?

class Product--- : IEnumerable<Product>

在我阅读其他问题之前,我实际上可能将其称为ProductCollection,但考虑到新信息,这会有点误导,因为它没有实现ICollection&lt;Product&gt;。你能叫它Products吗?

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

几乎可以工作,但听起来有点奇怪......你会怎么称呼它?

【问题讨论】:

类 ProductWhozitWhatzit ... 几个月来我一直在尝试让 ProductAmagig 进行登记 老实说,这是个人喜好/取决于高级开发人员。用于命名约定。我以前从未继承过“IList”,除非有一次(就在最近)。如果我需要一个集合对象,我将只从 System.Collections.Generic.List 继承。例如:“公共类 PlayerList : List @Zack:在你的那个例子中,就我个人而言,我可能最终会得到一些不同的东西,它有一个 List。例如具有 List Players get; 的类 Game 或者其他的东西。无论如何,题外话:p @Svish:我为自己创建了一个完整的对象,因为我可以为它们编写索引器。此外,PlayerList 是我的一个管理游戏服务器的项目中的一个具体示例。 “PlayerList”代表服务器中玩家的集合。 :-P 【参考方案1】:

您通常不会将类的名称基于它实现的任何接口。 (当有多个类时,您首先选择哪一个?)基于继承的类是很典型的,但更常见的是仅仅基于类的目的,当然不是界面。 (接口可能以类命名,如果有的话。)

您的示例有些无效,因为精心设计的 ProductCollection 应该实现 ICollection&lt;Product&gt; IEnumerable&lt;Product&gt; 而精心设计的 ProductList 应该同时实现这两个接口作为IList&lt;Product&gt;

如果您查看 .NET Framework 的 BCL,您应该注意到情况正是如此。 List&lt;T&gt; 类实现了所有三个接口,Collection&lt;T&gt; 类也是如此(但请注意,在一般情况下,“集合”不需要实现 IList&lt;T&gt;)。

【讨论】:

@Svish:很高兴它有帮助。 BCL 在这里通常是一个很好的模型(尽管它可能包含奇怪的不一致)。只要您在自己的类名上保持一致,就不会出错。【参考方案2】:

我认为“序列”是一个很好的后缀。

【讨论】:

实际上也在考虑那个。 确实如此。上面的海报没有考虑到项目列表可能是动态生成的,而不是由某种实际的列表或数组支持。【参考方案3】:

如果它只实现IEnumerable&lt;Product&gt;,那么我将它命名为ProductEnumeration,但我可以随意命名它的一个实例products。另一方面,我不记得曾经创建过只实现IEnumerable&lt;T&gt; 的类。如果您不能向其中添加东西似乎没有多大意义,如果可以,那么我将从实现 IEnumerable&lt;T&gt; 的集合类之一派生并继承该行为。

如果我要返回 Product 实体的枚举,我只需将其返回为 IEnumerable&lt;Product&gt; 而无需特殊类。

【讨论】:

【参考方案4】:

这取决于上下文,例如,它可能是ProductsCatalog(暗示IEnumerable 的只读性质)。

更一般地说,它可能是ProductsView。当然,获取的Products 是可以修改的,但我觉得它“听起来”很合适。

【讨论】:

【参考方案5】:

如果您查看 .NET Framework 中实现 IEnumerable&lt;T&gt; 的类型,我会说最常见的后缀是 Collection,然后是列表包含的复数形式。然后是一些“特殊情况”(例如QueueStack)。我个人会投票给Collection 作为第一手选择。

【讨论】:

【参考方案6】:

这里的问题是 List 或 Collection 强加了它们的行为方式。但是 IEnumerable 是非常通用的,不仅仅是 C# 中泛型的意思。每个实现都可以在它后面。

一些建议:

ProductIterator:迭代产品。 ProductRetriever:检索产品。 ProductCreator:这会在运行时创建新产品。

【讨论】:

我不会称之为ProductIterator。如果您实现IEnumerable,则有一个GetEnumerator 方法返回一个IEnumerator,它是实际的迭代器。【参考方案7】:

在我根据自己的经验能想到的几乎所有情况下,我都不必想出一个名字。编译器为我做这件事,因为我编写了一个迭代器方法而不是手动编写一个类。对于方法名称,将其设为描述序列的复数词似乎很自然。

【讨论】:

【参考方案8】:

就像 kek444 我想我得问问它还有什么作用?它实现了 IEnumerable 但这还不是全部,否则你就不需要这个类了,对吧?是收藏吗?它是否将一个可枚举转换为另一个(更改顺序、选择、生成等)?

【讨论】:

【参考方案9】:

我会说收藏。它可能建议使用 ReadOnlyCollection 或 ObservableCollection ,但它很好地描述了该类。毕竟它是产品的集合(无论底层类型是什么)。

要解决这个问题和另一个问题,请使用这个 ;)http://www.classnamer.com/

【讨论】:

以上是关于C#:你会给一个 IEnumerable 类起啥名字?的主要内容,如果未能解决你的问题,请参考以下文章

android中的context是起啥作用的?

C# 中 用委托有啥好处? 它起啥作用?

C#和Java中的构造器constructor是啥?起啥作用?为啥不可以被override??

在 C# 中将多个 IEnumerable<T> 提要混合为一个

C# 列出 IList 或 IEnumerable 作为参数

在 C# 中的列表上使用 IEnumerable [重复]