考虑两个名词的化合物,在自然英语中最常出现在“名词 名词”的形式,例如: “光的方向”,“滤光器的输出”。编程时,我们通常会编写“LightDirection”和“FilterOutput”。
现在,我有复数名词的问题。有两种情况:
1) 单数 复数
e.g。 “(两个)集合”,“(两个)段的交集”
哪个是正确的,SetUnion和SegmentIntersection或SetsUnion和SegmentsIntersection?
2) 复数复数
有两个子类:
(a)许多元素,每个元素都有许多相关元素,例如: “过滤器的输出”
(b)许多元素,每个元素都有单个相关元素,例如“向量的方向”
我应该使用FilterOutputs和VectorDirections或FiltersOutputs和VectorsDirections吗?
我怀疑第一个版本是正确的(FilterOutupts,VectorDirections),但我认为它可能导致含糊不清,例如。
一般规则是什么,我应该遵循?
答案 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),并且开发人员很好地理解它涉及大量项目。
您可以避免多数化您的名词,并使您明确处理多个数量的事实,并通过合并集合的名称来指示如何访问它们。例如,
因为它是一个集合类型,所以处理多个对象被理解为它是集合类型所特有的。然后它将它放在与SetUnion相同的类中 - 一个union总是涉及至少2个集合,而VectorDirectionList清楚地表明可以有多个VectorDirection。
我同意避免使用同义词,其中该单词具有多个单词类,例如过滤器,(实际上,Set,虽然在我看来Set不会真的在类名中用作动词,所以我把它解释为名词。)我最初用FilterOutput作为例子写了这个,但它没有读得好。使用化合物过滤可能有助于消除歧义 - 例如ImageFilterOutputs(或应用我自己的adivce,这将是ImageFilterOutputList。)
当你认为一个类的实例本身总是一个项目 - “一个实例”时,避免使用类名的复数形式似乎很自然。如果我们使用复数名称,那么我们会得到一个不匹配 - 一个试图暗示它是多个事物的实例 - 它本身只是一件事,即使它引用了多个其他事物。上面的集合命名建立在此基础上 - 你有一个列表,一个地图等实例,所以没有不匹配。
我假设您正在讨论编程语言结构,尽管同样的思想适用于表/视图。这些被理解为涉及大量的项目和表名因此通常是单个的(客户,订单,项目),即使它们存储多行。多对多映射表通常是相关实体的化合物,例如,将订单与物品相关联 - OrderItem。根据我的经验,对表名使用复数使得SQL难以阅读。
总而言之,我会避免复数,因为他们会更难阅读。肯定存在这样的情况:它们是不可避免的 - 使用复数形式比创建嵌套实体和集合的大名称更具可读性,但这些是规则之外的例外。
答案 3 :(得分:2)
一般规则是什么,我应该遵循?
用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[] vectors
和Directions[] vectorDirections
,并假设向量[i]对应于vectorDirections [i]。如果事情真的变得模棱两可,我会使用像vector_by_index和vectorDirection_by_index这样的东西。然后你可以拥有Map<Filter,Output> output_by_filter
或Map<Filter,Output[]> outputs_by_filter
,这使得键非常明显(这在Objective-C中非常重要,其中键或值的类型完全不明显)。 / p>
如果你真的想要,可以添加一个s并获取vectors_by_index,但是一致性会给你一个愚蠢的outputss_by_filter。
当然,正确的事情就像struct FilterState {Filter filter;输出[]输出; }; FilterState [] filterStates;。
答案 7 :(得分:0)
我建议第一个单词是单数:SetUnion
,VectorDirections
等。
在IDE中进行快速类搜索:for Strings *,Sets *,Vectors *,Collections *
无论如何,无论您选择什么, 都要在整个应用程序中保持一致 。