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

8

当我读到这个问题时,我开始有些思考。假设你有以下两个:

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

一个被称为 IEnumerable<Product> 的东西会被称为什么?
class Product--- : IEnumerable<Product>

在阅读其他问题之前,我可能会将其称为ProductCollection,但考虑到新的信息,这可能有些误导,因为它没有实现ICollection<Product>。您可以将其称为Products吗?

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

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

2
产品WhozitWhatzit类 { ... } - Juliet
我已经试图让ProductAmagig进入签入状态几个月了。 - blu
说实话,命名规范是个人偏好/由高级开发人员决定的。除了最近可能有一次之外,我以前从未继承过“IList<T>”。如果我需要一个集合对象,我会直接从System.Collections.Generic.List<T>继承。例如:“public class PlayerList : List<Player> {”。 - Zack
@Zack:在你的那个例子中,我个人可能会得出不同的结果,其中包含一个List<Player>。例如,一个类Game,有一个List<Player> Players { get; }或者其他什么的。无论如何,离题了:p - Svish
@Svish:我为整个对象创建一个对象本身,因为我可以为它们编写索引器。此外,“PlayerList”是我管理游戏服务器项目中的一个具体示例。“PlayerList”表示服务器中玩家的集合。:-P - Zack
啊哈。但是List不已经有索引器了吗?如果你需要一种不同类型的索引器,比如字符串,我认为可能更适合使用字典。就像如果键是玩家的名字一样。 - Svish
9个回答

8
通常不会根据类实现的任何接口来命名类名。(首先,如果有多个接口,你会选择哪一个?)通常会根据继承的类或者更简单地根据类的目的来命名类名,而不是根据接口。(如果有的话,接口可能会以类的名称命名。)
你的示例有些无效,因为设计良好的ProductCollection应该实现ICollection<Product>和IEnumerable<Product>,而设计良好的ProductList也应该实现这两个接口以及IList<Product>。
如果你查看.NET Framework的BCL,你应该会注意到这正是这种情况。List<T>类实现了这三个接口,Collection<T>类也是如此(尽管请注意,在一般情况下,“集合”不需要实现IList<T>)。

@Svish:很高兴能帮到你。BCL通常是一个很好的模型(尽管可能会出现一些不一致之处)。只要你自己的类名保持一致,就不会走太远。 - Noldorin

6
我认为“Sequence”会是一个很好的后缀。

其实我也在考虑那个。 - Svish
2
确实。上述海报并没有考虑到,项目列表可能是动态生成的,而不是由某种实际的列表或数组支持的。 - redcalx

5
如果它只实现了 IEnumerable<Product>,那么我会将其命名为ProductEnumeration,但我会自由地将其实例命名为 products。另一方面,我不记得曾经创建过一个仅实现了 IEnumerable<T> 的类。如果你不能向其中添加内容,那么似乎没有太多意义,而如果可以的话,我会从实现了 IEnumerable<T> 的集合类中派生出一个,并继承那种行为。
如果我要返回 Product 实体的枚举,我会简单地将其作为 IEnumerable<Product> 返回,而不需要特殊的类。

2

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

更普遍地说,它可以是ProductsView。当然,获取的Products是可修改的,但我仍然觉得这个术语听起来比较合适。


1
问题在于List或Collection强制它们以这种方式行事。但IEnumerable非常通用,不仅在C#的泛型意义上如此。每个实现都可能在其后面。
一些建议:
  • ProductIterator:这个迭代器遍历产品。
  • ProductRetriever:这个检索器检索产品。
  • ProductCreator:这个在运行时创建新产品。

1
我不会称它为“ProductIterator”。如果你实现了IEnumerable,那么就有一个返回IEnumeratorGetEnumerator方法,这才是真正的迭代器。 - Tom Lokhorst

0

如果你看一下实现了 IEnumerable<T> 接口的 .NET Framework 类型,我会说最常见的后缀是 Collection,其次是列表所包含内容的复数形式。然后还有一些“特殊情况”(比如 QueueStack)。我个人会首选 Collection


0
在我个人的经验中,几乎所有我能想到的情况下,我都不需要考虑名称。编译器会为我完成这项工作,因为我编写了一个迭代器方法而不是手动编写类。至于方法名称,将其描述为序列的复数形式似乎是很自然的选择。

0

像 kek444 一样,我认为我必须问它还能做什么?它实现了 IEnumerable<>,但这不是它的全部功能,否则你就不需要这个类了吧?它是一个集合吗?它是否将一个可枚举对象转换为另一个(更改顺序、选择、生成等)?


-1
我会说Collection。它可能会暗示一个ReadOnlyCollection或ObservableCollection,但它很好地描述了这个类。毕竟,它是产品的集合(无论底层类型是什么)。
为了解决这个问题和其他问题,请使用这个 ;)
http://www.classnamer.com/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接