代码之家  ›  专栏  ›  技术社区  ›  Michal Czardybon

语法正确的双名词标识符,复数形式

  •  17
  • Michal Czardybon  · 技术社区  · 16 年前

    以两个名词的复合词为例,在自然英语中,这两个名词最常见的形式是 名词 属于 名词 ,例如“光的方向”、“滤光片的输出”。在编程时,我们通常编写“lightdirection”和“filteroutput”。

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

    1) 单数的 属于 复数的

    例如,“两个集合的并集”,“两个线段的交集”

    哪个是正确的,setunion和segmentintersection还是setunion和segmentsintersection?

    2) 复数的 属于 复数的

    有两个子类:

    (a)许多元件,每个元件都有许多相关元件,例如“滤波器输出”

    (b)许多元件,每个元件都有一个相关元件,例如“矢量方向”

    我应该使用filteroutputs和vectorDirections还是filterOutputs和vectorDirections?

    我怀疑第一个版本是正确的(filteroutupts,vectorDirections),但我认为这可能会导致歧义,例如。

    • 滤波器输出-一个滤波器的多个输出还是多个滤波器的多个输出?
    • 线段投影-多个线段的投影还是单个线段的多个投影?

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

    8 回复  |  直到 14 年前
        1
  •  14
  •   Charles Stewart    16 年前

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

    1. X of Y

    进入之内

    2. Y X

    y将所有格(1)中的名词转换为定语(2)中的形容词。因此,当一个人可以在(1)中同时使x和y多元化时,他只能在(2)中使x多元化,因为(2)中的y是一个形容词,而形容词没有 grammatical number .

    因此,例如, SetsUnion 与英语不一致。如果它适合你,你可以自由使用它,但你追求的是不可接近性,我建议你不要这样做。

    后记

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

    3a. Y, its X

    等同复数:

    4a. Ys, their X

    它们的收缩,4b比3b更不常见:

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

    在这里, 夕阳 暗示它是一种单数所有格类型的呈现(3) Set's Union = Set, its Union ,在这里你想表达复数所有格(4) Sets, their Union (与不太常见的 Sets' Union )

    所以这是一种误导。

        2
  •  5
  •   Michael Anderson    16 年前

    除非您被约定驱动的系统(ruby on rails、cakephp等)所束缚,为什么不使用outputsoffilters、unionofsets等呢?它们可能不传统,但可能更清晰。

    例如,很明显projectionoflinesegments和projectionsoflinesegments是不同的东西,甚至projectionsoflinesegments….

        3
  •  5
  •   mdma    16 年前

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

    当有很多东西时,它们通常存储在数据结构中—数组、列表、映射、集合等。一般称为集合或 abstract data type . 与项目集合的接口通常是编程环境的一部分(例如,在Java和.NET中的集合,C++中的STL),开发者可以很好地理解它涉及到大量的项目。

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

    • 矢量方向列表-列出矢量及其方向,例如某种对类型。如果你有一个矢量方向,把矢量和方向结合起来,效果特别好。
    • 矢量方向映射-如果矢量方向是从矢量映射的。

    因为它是一个集合类型,所以处理多个对象被理解为是集合类型特有的。然后它将它与setunion放在同一个类中——一个union总是至少包含两个集合,vectorDirectionList清楚地表明可以有多个vectorDirection。

    我同意避免单词有多个单词类的同音词,例如filter(事实上,set,虽然在我的思维定势中,它不会真正用作动词,所以我将其解释为名词。)我最初是用filteroutput作为例子写这篇文章的,但它读起来并不好。使用复合过滤器可能有助于消除歧义,例如imagefilteroutputs(或应用我自己的adivce,这将是imagefilteroutputlist)。

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

    我假设您正在讨论编程语言构造,尽管同样的想法也适用于表/视图。它们被理解为包含大量项,因此表名通常是singlular(customer、order、item),即使它们存储多行。多对多映射表通常是相关实体的复合表,例如将订单与项目关联-orderitem。根据我的经验,对表名使用复数使sql很难读取。

    总而言之,我会避免复数形式,因为它们使阅读更困难。在某些情况下,使用复数形式比创建嵌套实体和集合的巨大名称更具可读性,但这些都是例外。

        4
  •  2
  •   Brock Adams    16 年前

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

    1. 成功 清除 --对于视觉和听觉思考者来说。
    2. 成功 具体但准确 .
    3. 穿过“拥挤的房间”或者 “紧急电话”测试 .

    用setsunion示例说明:

    • “set union”是正确的;它很容易被错别字混淆,说出来(即使在你的头脑中)也会把它混淆为“set's union”(或更糟)。

    • 复数也被隐含,所以第二个‘s’是多余的。 setunion更好,但仍然模棱两可。

    • 联合会更清楚,应该是最起码的标准。

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

    .
    最后, Phil Factor had the right of it . 释义:

    你能在一个拥挤的房间里大声喊出一个术语,然后让另一边的听众把它输入并成功地使用吗?

    试着在挤满了人的爱尔兰酒吧里大喊“集合工会”,甚至“集合工会”。;-)

        5
  •  1
  •   chris    16 年前

    1)我会使用setunion和segmentintersection,因为我认为在这种情况下,复数无论如何都是隐含的,这样看起来更好。

    2)同样,出于同样的原因,我会使用filteroutputs和vectorDirections。如果希望更具体,可以始终使用多重筛选输出。

    但最终完全取决于你的个人喜好。

        6
  •  1
  •   Jason Kleban    16 年前

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

        7
  •  1
  •   tc.    16 年前

    union()怎么了?

    而且,“集合的联合”变成了“集合的联合”(两个集合的联合是……);我相信我不是唯一一个对camelcase而不是camelscaseminosapostrophes满意的人。如果它需要一个撇号来解释,不要用它。set.union()的读法与“集合的并集”一模一样。

    数学也会说“A和B的(集合)联合”,或者很少说“A和B的(集合)联合”。A和B的组合“毫无意义!

    大多数人也会看到 Vector[] vectors Directions[] vectorDirections 并假设向量i对应于向量方向i。如果事情真的变得模棱两可,我会使用向量方向索引和向量方向索引。那你就可以 Map<Filter,Output> output_by_filter Map<Filter,Output[]> outputs_by_filter ,这使得键是什么非常明显(这在objective-c中非常重要,在objective-c中,键或值是什么类型完全不明显)。

    如果你真的想,你可以添加一个s并得到向量的索引,但是一致性会给你一个愚蠢的输出的过滤器。

    当然,正确的做法是类似struct filterstate{filter filter;output[]outputs;};filterstate[]filterstates;。

        8
  •  0
  •   Bozho    16 年前

    我建议第一个词用单数: SetUnion , VectorDirections 等。

    在IDE中快速进行类搜索,查找:strings*,sets*,vectors*,collections*

    不管怎样,不管你选择什么, 始终如一 在整个申请过程中。

    推荐文章