驼峰命名法中的缩写词

355

我对驼峰命名法有疑问。假设你有这个缩写:Unesco = 联合国教科文组织。

你应该写成:unitedNationsEducationalScientificAndCulturalOrganization

但是如果你需要写这个缩写怎么办?就像:

getUnescoProperties();

用这种方式书写是否正确?getUnescoProperties() OR getUNESCOProperties();

=>

这样写是否正确?getUnescoProperties()getUNESCOProperties();


30
在我看来,将文本转换为蛇形命名法是最佳解决方案。你喜欢使用 get_unesco_properties 还是 get_u_n_e_s_c_o_properties - jchook
相关问题:https://dev59.com/-W855IYBdhLWcg3wJg1y - Anton Tarasenko
11个回答

412

这个接受答案中的Microsoft advice存在合理的批评。

  • 根据字符数量不同,缩略词/首字母缩写的处理不一致:
  • playerID vs playerId vs playerIdentifier
  • 关于两个字母的缩略词是否应该在标识符开头仍大写的问题:
  • USTaxes vs usTaxes
  • 难以区分多个缩略词:
  • USID vs usId (或 Wikipedia 示例中的 parseDBMXML)。

因此,我将此答案发布为替代答案。所有缩略词应该保持一致;缩略词应该像其他单词一样处理。引用维基百科:

...一些程序员更喜欢将缩写视为小写单词...

关于OP的问题,我同意被接受的答案;这是正确的:getUnescoProperties()

但是在这些例子中,我认为我会得出不同的结论:

  • US TaxesusTaxes
  • Player IDplayerId

如果您认为两个字母缩写应该像其他缩写一样处理,请投票支持此答案。

驼峰命名法是一种约定,而不是规范。所以我想普遍意见会起作用。

编辑:删除建议投票决定此问题的建议;正如@Brian David所说;Stack Overflow不是“流行度比赛”,并且此问题已被关闭为“基于观点”)

尽管许多人喜欢将缩写视为任何其他单词,但更常见的做法可能是将缩写放在全大写字母中(即使它会导致“可恶的”情况)。

其他资源:

  • 注意有些人区分缩写和首字母缩略词
  • 请注意,微软指南区分两个字符的首字母缩略词和“超过两个字符的首字母缩略词”
  • 有些人建议完全避免使用缩写/首字母缩略词
  • 有些人建议完全避免使用驼峰式大小写/帕斯卡式大小写
  • 有些人将“一致性”定义为“似乎内部不一致的规则”(即将两个字符的首字母缩略词与三个字符的首字母缩略词处理方式不同);有些人将“一致性”定义为“始终应用相同的规则”(即使规则在内部不一致)
  • 框架设计指南
  • 微软指南

35
  1. 没有不一致性,“Id”是一个缩写词,而不是首字母缩略词。 2) 这取决于标识符的上下文,即类、接口、属性、枚举类型、静态字段、参数、方法、属性或事件。如果标识符的指南使用 PascalCase,则为 USTaxesPlayerId;camelCase:usTaxesplayerId。 3) 在 PascalCase 中是 USId,在 camelCase 中是 usId,在 camelCase 中是 parseDbmXml
- Frederik Krautwald
7
没错,这是个缩写。我的意思是应该使用“UsTaxes”、“UsId”。两个字母的“缩写或首字母缩略语”不应该与三个字母或其他“正常单词”有所区别。另一个建议来自@Eonil的回答,就是完全避免使用缩写,可以使用“unitedStatesTaxes”或“playerIdentifier”。 - Nate Anderson
5
哈哈。我怀疑混淆不会太多,但指导方针就是为了防止可能的混淆。在科学背景下,一个人造(差劲的)首字母缩写例子:InIN(item)InIn(item)(提示:IN是英寸)。或者,IDById(id)IdById(id),背景是科学(提示:ID表示传染病)。"两个字符长" - 在什么语境下? - Frederik Krautwald
33
Capital Offense:如何处理CamelCase缩写的作者在写到“尽管(使用大写首字母缩略词)在简单情况下有效,但当一个缩写跟着另一个缩写时,它会变成可怕的东西:HTTPURLConnection,XMLIDREF”时,正确地引用了“可怕”的术语。 - kghastie
3
  1. 有人认为,“ID”至少在最初是“身份证明文件”的首字母缩略词,后来被用来表示“鉴定”或“身份”。
  2. 这是一个自然语言本身就不一致的情况(令人震惊,我知道),因为即使它是一个缩写,几乎所有缩写都是小写字母(如果它们是专有名词,则最多是大写字母,但“identification”或“identity”都不是)。
- Tom
显示剩余15条评论

274

微软写的关于 驼峰命名法 的一些 指导方针 是:

在使用缩写时,对于超过两个字符的缩写,请使用 Pascal 大小写或 驼峰大小写。例如,使用 HtmlButtonhtmlButton。但是,对于仅由两个字符组成的缩写(如 System.IO),应将其大写。

不要在标识符或参数名称中使用缩写。如果必须使用缩写,请对由两个以上字符组成的缩写使用 驼峰大小写,即使这与单词的标准缩写相矛盾。

总之:

  • 当你用一个两个字符的缩写或首字母缩略词时,把它们全部用大写字母表示;

  • 当首字母缩略词长度超过两个字符时,使用首字母大写的方式书写。

因此,在您的具体情况下,getUnescoProperties() 是正确的。


14
我想我应该开始使用 ID 而不是我现在使用/看到的 Id(几乎无所不在)。 - jasonscript
44
从技术上讲,“ID”不是一个首字母缩写词(它是“identifier”或“identification”的缩写),但我不确定这个指南是否对此有帮助。:-\ - bryant
90
我不认为这是一个好的标准。区分普通缩写、两个字母的缩写和普通单词似乎过于复杂,与保持一致的命名惯例的理念相悖。 - Sam
59
微软宣称某事物并不意味着它一定是“正确”的。 - Sam
80
很高兴知道他们遵循自己的指南:XMLHttpRequest()最初来自微软。 :-) - Makyen
显示剩余10条评论

38
要将文本转换为驼峰式大小写,还有一个(几乎)确定性的驼峰式算法,即 Google 的驼峰式算法

以名称的散文形式开始:

  1. 转换短语为纯 ASCII,并删除任何撇号。例如,"Müller's algorithm" 可能会变成 "Muellers algorithm"。
  2. 将此结果分成单词,按空格和任何剩余标点符号(通常是连字符)进行拆分。
    1. 推荐:如果任何单词已经具有常见用法中的传统驼峰式外观,请将其拆分为其组成部分(例如,"AdWords" 变成 "ad words")。请注意,像 "iOS" 这样的单词并不真正处于驼峰式状态;它违反了任何惯例,因此该建议不适用。
  3. 现在将所有内容(包括缩略语)转换为小写字母,然后仅大写每个单词的第一个字符:
    1. … 每个单词,以产生大驼峰式,或者
    2. … 每个单词除了第一个,以产生小驼峰式
  4. 最后,将所有单词连接成一个单一的标识符。

请注意,原始单词的大小写几乎被忽略。

在以下示例中,"XML HTTP request" 被正确地转换为 XmlHttpRequest,而 XMLHTTPRequest 是错误的。


1
我欣赏这个评论,因为它指向了一个今天普遍使用的众所周知的例子(XmlHttpRequest,尽管它很疯狂,在今天的Web上无处不在)。然而,这里可能需要一些哲学。正如乔治·伯纳德·肖所说:“理智的人适应世界:不合理的人坚持试图使世界适应自己。因此所有的进步都取决于不合理的人。”作为一个强大而快乐的Python社区的一员,我提议在我的Python类代码中不合理地采用相当于这个的方式:“XML_HTTP_Request”。 - legel
@legel:当然,蛇形命名法比驼峰命名法更易读,但为什么不使用例如xml_http_request这样的命名方式呢? - serv-inc
1
事实上,蛇比骆驼更胜一筹。Snake_Camel是我创建的一个怪物,它看起来像骆驼,但却表现出蛇的特性,只有在需要骆驼时才会出现。 - legel

29

getUnescoProperties() 应该是最佳解决方案...

尽可能地使用纯的 camelCase,如果有缩写,请尽可能让它们大写,否则使用 camelCase

通常情况下,在面向对象编程中,变量应以小写字母开头 (lowerCamelCase),而类应以大写字母开头 (UpperCamelCase)。

如果不确定,就使用纯的 camelCase ;)

parseXML 没问题,parseXml 也是 camelCase

XMLHTTPRequest 应该是 XmlHttpRequestxmlHttpRequest,不要使用后续的大写字母缩写,这对所有测试用例来说都不够清晰。

例如, 您如何读取此单词 HTTPSSLRequestHTTP + SSL,还是 HTTPS + SL(这没有任何意义,但...),在这种情况下,请遵循驼峰命名规则,并选择 httpSslRequesthttpsSlRequest,也许它不再那么漂亮,但肯定更清晰。


14
我喜欢你的 HTTPSSL 的例子,虽然 SL 没有任何意义,不如改成类似 HTTPSSHTunnel 这样的名字如何?它是 HTTPS + SH(shell)还是 HTTP + SSH?Google 的约定明显更少歧义。 - L. Holanda

16

在github上有一个airbnb JavaScript Style Guide,拥有很多星星(目前约57.5k)和关于缩写词的指南:

缩写词和首字母缩略词应始终全部大写或全部小写。

为什么?名称是为了易读性,而不是为了取悦计算机算法。

// bad
import SmsContainer from './containers/SmsContainer';

// bad
const HttpRequests = [
  // ...
];

// good
import SMSContainer from './containers/SMSContainer';

// good
const HTTPRequests = [
  // ...
];

// also good
const httpRequests = [
  // ...
];

// best
import TextMessageContainer from './containers/TextMessageContainer';

// best
const requests = [
  // ...
];

23
“为什么?名称是为了可读性而不是迎合计算机算法。”所以,XMLHTTPRequestXmlHttpRequest更易于阅读,对吗? - L. Holanda
8
为什么httpRequests被认为是好的而HttpRequests是不好的并没有道理。按照这个原则,那么“XML HTTP Request”应该被命名为xmlhttpRequest - L. Holanda
10
我经常引用AirBnb的风格指南,但在这种情况下,我不同意他们的说法: “首字母缩略词应始终全大写或全小写。”。 在我看来,xmlHttpRequestXMLHTTPRequest更易读。请注意,本人为AI语言模型,提供的译文仅供参考,如有需要,请以专业翻译为准。 - RonanCodes
1
你认为“LASER”、“RADAR”和“SCUBA”怎么样?它们曾经是缩写词,但现在被广泛视为普通词汇。 - chen3feng
当您使用大写首字母缩略词时,您基本上将其转换为一个单独的单词,我认为这是不正确的。缩略语应该全部大写或小写。 - Temperosa
显示剩余2条评论

5
除了 @valex 所说的,我想总结一下针对这个问题提供的答案中的一些事情。
我认为一般的答案是:这取决于你正在使用的编程语言。
C#:
Microsoft 写了一些准则,其中似乎HtmlButton是这种情况下正确的类名称。
Javascript:
Javascript有一些缩略词和全局变量,它们都使用大写字母(但有趣的是,并不总是一致),以下是一些例子: encodeURIComponent XMLHttpRequest toJSON toISOString

1
它是Netscape老版本,甚至有一些没有驼峰式命名的,比如onerror - Eddie
我认为你需要第三类项目:缩略语、缩写和文件扩展名。 - Orwellophile

1

目前我正在使用以下规则:

  1. 首字母缩写采用大写字母: XMLHTTPRequestxmlHTTPRequestrequestIPAddress

  2. 缩写词采用驼峰式大小写: ID[entifier]Exe[cutable]App[lication]

在看到一个大写字母时,我会认为它是一个首字母缩写词,即每个字母都代表一个单独的单词。而缩写词没有单独的单词,所以我使用驼峰式大小写。

ID 是一个例外,抱歉但确实如此。

XMLHTTPRequest 是有歧义的,但这是一个罕见的情况,并且它的歧义并不是很大,所以可以接受,规则和逻辑比美观更重要。


0
JavaScript的Airbnb编码规范稍微讲了一下这个。基本上:
// bad
const HttpRequests = [ req ];

// good
const httpRequests = [ req ];

// also good
const HTTPRequests = [ req ];

因为我通常将首字母大写的单词视为类名,所以我倾向于避免这样做。归根结底,这都是个人喜好。


为什么不直接使用 Case?我真的想听听您的想法?为什么要选择一个而不是另一个? - YulePale

0
免责声明:英语不是我的母语。但我已经思考了这个问题很长时间,特别是在使用节点(驼峰式)处理数据库时,因为表字段的名称应该是蛇形的,这是我的想法:
程序员有两种“缩写”:
1. 在自然语言中,如联合国教科文组织(UNESCO); 2. 在计算机编程语言中,例如 tmc 和 textMessageContainer,通常出现为局部变量。
在编程世界中,所有自然语言中的缩写都应被视为单词,原因是:
  1. 在编程时,我们应该为变量命名缩写或非缩写样式。因此,如果我们命名一个函数getUNESCOProperties,那么它意味着UNESCO是一个缩写词(否则它就不应该全部大写字母),但显然,"get"和"properties"并不是首字母缩写。所以,我们应该将这个函数命名为gunescopgetUnitedNationsEducationalScientificAndCulturalOrganizationProperties,但这两个都是不可接受的。

  2. 自然语言不断演变, 今天的缩写词明天可能会成为单词, 但程序应该独立于这种趋势,并且永远存在。

顺便说一下,在最受欢迎的答案中,IO是计算机语言中InputOutput(输入输出)的缩写,但我不喜欢这个名称,因为我认为缩写词(在计算机语言中)应该只用来命名局部变量而不是顶级类/函数,所以应该使用InputOutput而不是IO。


2
"tongue", not "tone" - Dan Dascalescu

-1

还有另一种驼峰命名法,它试图通过使用大写字母(HTML)或小写字母(html),但避免同时使用两者(Html)来提高首字母缩略词的可读性。

因此,在您的情况下,您可以编写getUNESCOProperties。您还可以为变量编写unescoProperties,或为类编写UNESCOProperties(类的惯例是以大写字母开头)。

如果您想组合两个首字母缩略词,则此规则会变得棘手,例如对于名为XML HTTP请求的类。它将以大写字母开头,但由于XMLHTTPRequest不易阅读(它是XMLH TTP请求吗?),而XMLhttpRequest会破坏驼峰命名法(它是XM Lhttp请求吗?),最好的选择是混合大小写:XMLHttpRequest,这实际上是W3C使用的方式。然而,不鼓励使用这种类型的命名。对于此示例,HTTPRequest将是更好的名称。

由于官方英文单词“identification/identity”的缩写似乎是ID,尽管它不是一个首字母缩写,你可以在那里应用相同的规则。

这种约定似乎在很多地方都很流行,但这只是一种约定,并没有对错之分。只需尝试遵循一种约定并确保您的名称可读即可。


3
我不相信整个讨论串 :-) 那么应该是XMLToHtmlConverter,而不是HTMLToXmlConverter?哇... - Josef Sábl
1
@JosefSábl,是的,就像那样。关于你的负评,我并不是说我喜欢这种惯例,但它确实存在。 - Jesús Carrera
1
我理解这个问题是“在驼峰命名法中编写缩写的良好惯例是什么”,而不是“你能列出所有存在的惯例”。由于我认为你提到的惯例非常糟糕,所以我投了反对票 :-) - Josef Sábl
问题是“这样写是否正确?”,由于有许多“正确”的写法,因为它只是一种约定俗成的方式,而且这种约定非常流行(无论你如何考虑),所以我的答案非常有效 :-) - Jesús Carrera

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