关于命名约定:计数与集合中的长度与大小

count vs length vs size in a collection

通过使用许多编程语言和库,我注意到集合中元素总数所用的各种术语。

最常见的似乎是lengthcountsize

如。

1
2
3
array.length
vector.size()
collection.count

有什么好用的术语吗?它是否取决于它是什么类型的集合?即可变/不变

是否首选它是属性而不是方法?


Length()倾向于指相邻的元素——例如,字符串有一个长度。

Count()倾向于指较宽松集合中的元素数。

Size()倾向于指集合的大小,通常这与向量(或字符串)等情况下的长度不同,一个字符串中可能有10个字符,但存储空间保留为20。也可参考元素数量-检查来源/文档。

Capacity()—专门指集合中分配的空间,而不是集合中有效元素的数量。如果类型同时定义了"容量"和"大小",那么"大小"通常是指实际元素的数量。

我认为重点在于人类语言和习语,字符串的大小似乎不太明显,而集合的长度同样令人困惑,即使它们可能被用来指代数据集合中的相同事物(元素数)。


fwiw(这几乎是零),我更喜欢"count",因为它似乎表明它将返回集合中元素/项目的数量,非常明确。

当面对术语"长度"或"大小"时,我常常会想一想(甚至被迫重新阅读文档),到底这该死的东西会告诉我该集合中有多少元素,或者该集合正在消耗多少字节。对于打算像数组或字符串那样连续的集合,这一点尤其适用。

但是,没有人负责Java、BCL/.NET或C/C++标准框架/库所使用的命名约定,而他们却懒得问我,所以你们都被他们所提出的任何东西所困扰。

如果我比我聪明得多,而且被命名为比亚恩,你们所有人也许都能免于痛苦…

当然,回到现实世界中,你应该坚持使用你所使用的语言/平台的任何命名约定(例如,C++中的EDCOX1,0)。这似乎并不能帮助你解决你的Array.Length困境。


虽然在某些情况下,我更喜欢一个术语而不是另一个。通常,如果您考虑如何将此元素的长度/大小/计数口头描述给其他人,那么您可以得到最佳的用法。.

Length()表示元素有一个长度。字符串有长度。你说"一个字符串有20个字符长",对吗?所以它有一个长度。

Size()表示元素具有大小。例如,文件有大小。你说"这个文件的大小是2 MB",对吗?所以它有一个尺寸。

也就是说,一个字符串也可以有一个大小,但我希望这里有其他的东西。例如,utf-16字符串的长度可能为100个字符,但由于每个字符都由两个字节组成,所以我希望大小为200。

Count()是非常不寻常的。Objective-C使用Count计算数组中的元素数。人们可能会争论数组是否具有长度(如Java)、大小(如大多数其他语言)或计数。但是,大小也可以是字节大小(如果数组项为32位int,则每个项为4字节)和长度…我不会说"一个数组有20个元素长",这听起来很奇怪。我会说"一个数组有20个元素"。我不确定count是否表达得很好,但我认为count在这里是elementCount()的一个简短形式,对数组来说,它比length()或size()更有意义。

如果您在编程语言中创建自己的对象/元素,最好使用其他类似元素所使用的任何内容,因为程序员习惯于使用该术语访问所需的属性。


如果您要查找集合中的项目数,我认为count是最明显的术语。对于那些还没有特别关注某一特定语言的新程序员来说,这甚至应该是显而易见的。

它应该是一个属性,因为它就是这样的:集合的描述(又称属性)。一个方法意味着它必须对集合做一些事情来获取项目的数量,而这似乎是不具有逻辑性的。


嗯……我不会用尺寸。因为这可能与字节大小混淆。长度-对于数组来说是有意义的,只要它们使用后续的内存字节。虽然…长度…在什么?计数已清除。有多少元素。我会用计数。

关于属性/方法,我将使用属性来标记它的速度,而方法来标记它的速度。

最重要的是,我会坚持你使用的语言/库的标准。


正在添加到@gbjbaanb的答案中…

如果"property"意味着对值的公共访问,我会说"method"更适合于提供封装和隐藏实现。

您可能会改变您对如何使用count元素或如何维护count元素的看法。如果它是一个属性,那么您就陷入了困境——如果它是通过一个方法访问的,那么您可以在不影响集合用户的情况下更改底层实现。


在elixir中,实际上有一个清晰的命名方案与语言中的不同类型相关。

When"counting" the number of elements in a data structure, Elixir
also abides by a simple rule: the function is named size if the
operation is in constant time (i.e. the value is pre-calculated) or
length if the operation is linear (i.e. calculating the length gets
slower as the input grows).


我想说,这取决于您使用的特定语言和类。例如,在C中,如果使用的是数组,则具有属性长度;如果具有从IEnumerable继承的内容,则具有扩展方法count(),但它并不快。如果您继承了ICollection,则具有属性计数。


对我来说,这有点像问"for each"是否比"for each"更好。它仅仅取决于语言/框架。