在语法上正确的双名词标识符,复数版本

时间:2010-05-05 13:15:22

标签: naming-conventions

考虑两个名词的化合物,在自然英语中最常出现在“名词 名词”的形式,例如: “光的方向”,“滤光器的输出”。编程时,我们通常会编写“LightDirection”和“FilterOutput”。

现在,我有复数名词的问题。有两种情况:

1) 单数 复数

e.g。 “(两个)集合”,“(两个)段的交集”

哪个是正确的,SetUnion和SegmentIntersection或SetsUnion和SegmentsIntersection?

2) 复数复数

有两个子类:

(a)许多元素,每个元素都有许多相关元素,例如: “过滤器的输出”

(b)许多元素,每个元素都有单个相关元素,例如“向量的方向”

我应该使用FilterOutputs和VectorDirections或FiltersOutputs和VectorsDirections吗?

我怀疑第一个版本是正确的(FilterOutupts,VectorDirections),但我认为它可能导致含糊不清,例如。

  • FilterOutputs - 单个过滤器的许多输出或许多过滤器的许多输出?
  • LineSegmentProjections - 多个细分的预测或单个细分的多个投影?

一般规则是什么,我应该遵循?

8 个答案:

答案 0 :(得分:14)

这个问题背后存在语法上的误解。当我们转换形式的短语时:

1. X of Y

进入

2. Y X

Y改变了从占有性(1)中的名词到属性(2)中的形容词的语法角色。因此,虽然(1)中的X和Y都可以复数,但是(2)中的X可能只有多个,因为(2)中的Y是形容词,而形容词没有grammatical number

因此,例如,SetsUnion不符合英语。如果它适合你,你可以自由使用它,但你正在追求不可读性,我建议反对它。

<强>后记

特别考虑另外两种占有式结构,首先是使用所有格代词“它”的老式结构,单数:

3a. Y, its X

等价的复数:

4a. Ys, their X

和他们的收缩,4b比3b少得多:

3b. Y's X
4b. Ys' X

在这里,SetsUnion表明它是单数所有格类型(3)Set's Union(= Set, its Union)的渲染,你打算传递复数所有格(4){{ 1}}(缩小为不太常见的Sets, their Union)。

所以它有误导性。

答案 1 :(得分:5)

除非你受到常规驱动系统(ruby on rails,cakePHP等)的影响,否则为什么不使用OutputsOfFilters,UnionOfSets等?它们可能不是传统的,但它们可能更清晰。

例如,很明显,ProjectionOfLineSegments和ProjectionsOfLineSegment是不同的东西,甚至是ProjectionsOfLineSegments ......

答案 2 :(得分:5)

使用复数形式的名词会使它们更难以阅读。

当你有很多东西时,它们通常存储在数据结构中 - 数组,列表,地图,集等等。通常称为集合或abstract data type。项集合的接口通常是编程环境的一部分(例如,java和.net中的集合,C ++中的STL),并且开发人员很好地理解它涉及大量项目。

您可以避免多数化您的名词,并使您明确处理多个数量的事实,并通过合并集合的名称来指示如何访问它们。例如,

  • VectorDirectionList - 列出向量及其方向,例如某种配对类型。如果你有一个VectorDirection,结合了Vector和一个方向,那就特别好用了。
  • VectorDirectionMap - 如果矢量方向是从矢量映射的。

因为它是一个集合类型,所以处理多个对象被理解为它是集合类型所特有的。然后它将它放在与SetUnion相同的类中 - 一个union总是涉及至少2个集合,而VectorDirectionList清楚地表明可以有多个VectorDirection。

我同意避免使用同义词,其中该单词具有多个单词类,例如过滤器,(实际上,Set,虽然在我看来Set不会真的在类名中用作动词,所以我把它解释为名词。)我最初用FilterOutput作为例子写了这个,但它没有读得好。使用化合物过滤可能有助于消除歧义 - 例如ImageFilterOutputs(或应用我自己的adivce,这将是ImageFilterOutputList。)

当你认为一个类的实例本身总是一个项目 - “一个实例”时,避免使用类名的复数形式似乎很自然。如果我们使用复数名称,那么我们会得到一个不匹配 - 一个试图暗示它是多个事物的实例 - 它本身只是一件事,即使它引用了多个其他事物。上面的集合命名建立在此基础上 - 你有一个列表,一个地图等实例,所以没有不匹配。

我假设您正在讨论编程语言结构,尽管同样的思想适用于表/视图。这些被理解为涉及大量的项目和表名因此通常是单个的(客户,订单,项目),即使它们存储多行。多对多映射表通常是相关实体的化合物,例如,将订单与物品相关联 - OrderItem。根据我的经验,对表名使用复数使得SQL难以阅读。

总而言之,我会避免复数,因为他们会更难阅读。肯定存在这样的情况:它们是不可避免的 - 使用复数形式比创建嵌套实体和集合的大名称更具可读性,但这些是规则之外的例外。

答案 3 :(得分:2)

  

一般规则是什么,我应该遵循?

  1. 为视觉和听觉思考者提供清除
  2. 使其具体但准确
  3. 让它通过“拥挤的房间”或“紧急电话”测试
  4. 用SetsUnion示例说明:

    • “SetsUnion”正好出局;很容易混淆一个拼写错误并且说出来(即使在你脑子里)会把它混淆为“Set's Union”(或更糟)。

    • 复数也是隐含的,所以第二个'是多余的。 SetUnion更好但仍然含糊不清。

    • UnionOfSets更清晰,应该是最低标准。

    • 但到目前为止,所有这些都是无用的模糊(除非你使用纯数学理论)。
      这个词应该是具体的。例如,“红色汽车”,“花费太多时间在esoterica上的程序员”等 这些都是集合的联合,但它们会告诉你一些有用的东西。 ; - )


    最后,Phil Factor had the right of it。换句话说:

      

    你可以在一个拥挤的房间里大喊一个(长期)并让它被另一边的听众键入并成功(使用)吗?

    在一个挤满爱尔兰的酒吧里试着大喊“SetsUnion”,甚至“UnionOfSets”。 ; - )

答案 4 :(得分:1)

1)我会使用SetUnion和SegmentIntersection,因为我觉得在这种情况下无论如何隐含多个,它只是看起来更好。

2)再次,我会使用FilterOutputs和VectorDirections,原因相同。如果您想要更具体,可以使用MultipleFilterOutputs。

但最终完全取决于您的个人偏好。

答案 5 :(得分:1)

我认为虽然一般的命名约定和一致性很重要,但是在一个非常紧凑/棘手的算法中,清晰度应该胜过常规。如果有帮助,请使用veryLongAndDescriptiveIdentifiers。

答案 6 :(得分:1)

Union()有什么问题?

此外,“集合联盟”变成“集合”联盟(两集'联盟是......);我敢肯定,我不是唯一一个对CamelCase有好处的人,而不是CamelsCaseMinusApostrophes。如果它需要撇号才有意义,请不要使用它。 Set.Union()的读取与“set of s(s)”完全相同。

数学也会说“A和B的(集合)联合”,或很少说“A和B(集合)联合”。 “A和B的集合”没有任何意义!

大多数人还会看到Vector[] vectorsDirections[] vectorDirections,并假设向量[i]对应于vectorDirections [i]。如果事情真的变得模棱两可,我会使用像vector_by_index和vectorDirection_by_index这样的东西。然后你可以拥有Map<Filter,Output> output_by_filterMap<Filter,Output[]> outputs_by_filter,这使得键非常明显(这在Objective-C中非常重要,其中键或值的类型完全不明显)。 / p>

如果你真的想要,可以添加一个s并获取vectors_by_index,但是一致性会给你一个愚蠢的outputss_by_filter。

当然,正确的事情就像struct FilterState {Filter filter;输出[]输出; }; FilterState [] filterStates;。

答案 7 :(得分:0)

我建议第一个单词是单数:SetUnionVectorDirections等。

在IDE中进行快速类搜索:for Strings *,Sets *,Vectors *,Collections *

无论如何,无论您选择什么, 都要在整个应用程序中保持一致