CamelCase的首字母缩写词


243

我对CamelCase有疑问。假设您有这个缩写:Unesco = United Nations Educational, Scientific and Cultural Organization.

您应该写: unitedNationsEducationalScientificAndCulturalOrganization

但是,如果您需要写首字母缩略词怎么办?就像是:

getUnescoProperties();

这样写是对的吗? getUnescoProperties() OR getUNESCOProperties();


2
这不应该在程序员身上吗?
Pacerier,2015年

5
IMO转换为snake_case提供了最佳解决方案。你喜欢get_unesco_properties还是get_u_n_e_s_c_o_properties
jchook


Answers:


194

Microsoft编写的一些准则camelCase是:

使用首字母缩写词时,对于长度超过两个字符的首字母缩写词,请使用Pascal大小写或驼峰式大小写。例如,使用HtmlButtonhtmlButton。但是,您应该将仅包含两个字符的首字母缩写大写,例如System.IO而不是System.Io

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

加起来:

  • 使用长度为两个字符的缩写词或首字母缩写词时,请将其全部大写;

  • 当首字母缩写词超过两个字符时,请使用大写字母作为第一个字符。

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


11
我想我应该开始使用ID,而不是Id(我用/看到到处)
jasonscript

30
从技术上讲,“ ID”不是首字母缩写词(是“ identifier”或“ identification”的缩写),但我真的不知道该指南如何/是否可以帮助该指南。:-\
bryant

63
我认为这不是一个好的标准。区分普通首字母缩写词,两个字母的首字母缩写词和普通单词似乎过于复杂,并且与具有一致的命名约定的想法背道而驰。
山姆

40
同样,被微软声明并不能使事情“正确”。
2014年

48
很高兴得知他们遵循自己的准则:XMLHttpRequest()最初来自Microsoft。
Makyen '16

314

接受的答案对Microsoft的建议有合理的批评。

  • 根据字符数,首字母缩写词/首字母缩写词的用法不一致:
    • playerIDVS playerIdVS playerIdentifier
  • 如果两个字母的首字母缩写出现在标识符的开头,是否仍应大写:
    • USTaxesusTaxes
  • 难以区分多个首字母缩写词:
    • USIDvs usId(或parseDBMXML在Wikipedia的示例中)。

因此,我将发布此答案作为已接受答案的替代方法。所有首字母缩写词均应一视同仁;首字母缩写词应像其他任何单词一样对待。引用维基百科

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

所以关于:OP的问题,我同意接受的答案;这是对的:getUnescoProperties()

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

  • US TaxesusTaxes
  • Player IDplayerId

因此,如果您认为两个字母的首字母缩写应该像其他首字母缩写一样对待,请投票给这个答案

骆驼套是惯例,不是规格。所以我猜想民意规则。

编辑:删除建议由投票决定这个问题的建议;正如@Brian David所说; Stack Overflow不是“人气竞赛”,并且这个问题被封闭为“基于观点”)

即使许多人喜欢将首字母缩略词与其他词一样对待,更常见的做法可能是将首字母缩略词大写(即使这会导致“憎恶”)

其他资源:

  • 请注意,有些人会区分缩写和首字母缩写词
  • 注意Microsoft准则区分两个字符的首字母缩写词和“超过两个字符长的首字母缩写词”
  • 请注意,有些人建议完全避免使用缩写词或首字母缩写词
  • 请注意,有些人建议完全避免使用CamelCase / PascalCase
  • 请注意,有些人将“一致性”与“内部看起来不一致的规则”区分开来(即,将两个字符的首字母缩写与三个字符的首字母缩写区别对待);有些人将“一致性”定义为“一致地应用同一规则”(即使该规则内部不一致)
  • 框架设计准则
  • Microsoft准则

26
1)没有矛盾。“ Id”是缩写,而不是首字母缩写。2)它取决于标识符的上下文,即类,接口,属性,枚举类型,静态字段,参数,方法,属性或事件。如果标识符的准则是使用PascalCase,则它将是USTaxesPlayerId; camelCase:usTaxesplayerId。3)USId在PascalCase,usIdcamelCase和parseDbmXmlcamelCase中。
Frederik Krautwald

6
您是对的,它是缩写。我的观点是,它应该是UsTaxes,UsId。两个字母的“缩写或首字母缩写”不应与三个字母或其他“常规词”区别对待。来自@Eonil的答案的其他建议是完全避免使用起酥油。unitedStatesTaxes或playerIdentifier。
红豌豆

3
哈哈。我怀疑会引起混乱-很多-但这些准则是防止可能出现混乱的准则。科学上下文中人为的(错误的)首字母缩写示例:InIN(item)vs InIn(item)(提示:IN为英寸)。或者,IDById(id)vs IdById(id)。情境科学(提示:ID表示传染病)。“两个字符长”-在哪种情况下?
Frederik Krautwald

2
Microsoft链接上 “ ...使用Pascal大小写或驼峰式大小写来表示两个以上字符的首字母缩写。...但是,您应该将包含两个字符的首字母缩写大写...”这就是我所说的“不一致的部分”。更好的表征是“异常”。至少您已经弄清楚了为什么两个字母的首字母缩写可能会更加混乱。但是我想那些带有“ CanCan”的程序真是运气不佳。模棱两可,无论是舞蹈动作还是南特Cercle de l'Aviron de Nantes社区网:)
红豌豆2015年

18
资本犯罪:如何在CamelCase中处理缩略语》的作者在写道:“虽然[使用大写首字母缩略词]在简单情况下有效,但是当一个缩略语紧跟另一个时,则会导致可憎性:HTTPURLConnection,XMLIDREF”
kghastie 2015年

21

首先,我必须澄清自己不是英语母语人士,所以我对英语语法的主张可能是错误的。如果您发现此类错误,请告诉我,我将非常感谢。


首字母缩略词的最佳实践是尽可能避免首字母缩略词。无论如何,情况并非如此,因为首字母缩写UNESCO比全名更熟悉UnitedNationsEducationalScientificAndCulturalOrganization

然后,我认为UNESCOUnesco因为更接近现实生活形式而更加熟悉而有意义。我很难弄清楚这个词的Unesco实际含义。

再举一个例子,考虑一下Arc。这听起来像是绕圆的曲线,但是在Rust中,这意味着Atomically Reference Counted。如果是这样写的ARC,至少读者会认识到该词是其他东西的缩写,而不是某种曲线。

现代程序主要是为人类读者编写的。然后,必须为人类可读性而不是机器处理或分析设置那些命名规则。

从这个角度来看,我们通过使用Unescoover UNESCO而却一无所获而失去了一些可读性。

对于其他任何情况,我认为仅遵循简单的英语首字母缩写规则(或约定)就足以在大多数情况下获得最佳可读性


4
上面的示例有些误导。“我见过的最好的方法是苹果公司的...……这意味着将首字母缩略词当作专有名词来对待……因此联合国教科文组织更具意义”-那不是你写专有名词的方式。
Mikko Rantanen 2015年

@MikkoRantanen我更新了答案。
Eonil '16

7
哇,我几乎无法在该答案中找到一个我同意的句子:-)
JosefSábl16年

这完全取决于您正在处理的代码的上下文,缩写/缩写是否有意义。例如,我从事金融工作,有很多独特的术语在整个行业乃至整个世界都是统一的。如果不使用将在该公司工作的每个人都心知肚明的首字母缩略词,您将浪费时间并造成不必要的冗长。例如,PV表示现值,FV表示未来值,平均值表示平均值,指数表示幂等,等等
Will Ediger

@ pm100不是我说的吗?教科文组织不是您写专有名词的方式。
Mikko Rantanen

17

要转换为CamelCase,还可以使用Google的(几乎)确定性的Camel案例算法

从名字的散文形式开始:

  1. 将短语转换为纯ASCII并删除所有撇号。例如,“穆勒算法”可能会变成“穆勒算法”。
  2. 将此结果划分为单词,在空格和所有剩余的标点符号(通常为连字符)之间进行分割。
    1. 推荐:如果任何单词在常规用法中已经具有常规的驼峰式外观,则将其拆分为各个组成部分(例如,“ AdWords”变成“ ad words”)。请注意,诸如“ iOS”之类的词本身并不是驼峰式的;它违反任何约定,因此该建议不适用。
  3. 现在将所有内容(包括首字母缩写词)都小写,然后仅将以下内容的第一个字符大写:
    1. ……每个单词,以产生大写的驼峰大写字母,或
    2. …除第一个单词外的每个单词,以产生小写的驼峰字母
  4. 最后,将所有单词合并为一个标识符。

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

在以下示例中,“ XML HTTP请求”已正确转换为XmlHttpRequest,XMLHTTPRequest不正确。


17

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

如果可能的话,请遵循纯文本camelCase;当您使用首字母缩写词时,请尽可能使它们大写camelCase

通常,在OO中,编程变量应以小写字母(lowerCamelCase)开头,而类应以大写字母(UpperCamelCase)开头。

如有疑问,请纯净camelCase;)

parseXML是罚款,parseXmlcamelCase

XMLHTTPRequest应该XmlHttpRequestxmlHttpRequest没有办法使用后续的大写字母首字母缩写词,但对于所有测试用例而言,它尚不确定。

例如,您如何读懂这个单词HTTPSSLRequestHTTP + SSL或,HTTPS + SL(但是什么都没有……),在这种情况下,请遵循驼峰式惯例并选择httpSslRequesthttpsSlRequest,也许它不再好了,但绝对更加清楚。


2
我喜欢您的HTTPSSL示例,尽管SL并不代表什么,但是HTTPSSHTunnel之类的东西呢?是HTTPS + SH(shell)还是HTTP + SSH?Google约定绝对不那么模棱两可。
L. Holanda

10

github上有airbnb JavaScript样式指南,上面有很多星星(目前约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 = [
  // ...
];

7
为什么?名字是为了可读性,而不是为了安抚计算机算法 ”,所以,XMLHTTPRequest方法比可读性更好XmlHttpRequest,对吗?
L. Holanda

2
为什么没有httpRequests被认为是好却HttpRequests是坏的没有道理。遵循这个原则,对于XML HTTP Request应该是xmlhttpRequest???
L. Holanda

1
我经常引用AirBnb样式指南,但在这种情况下,我不同意。我特别不同意他们的说法:“首字母缩写词和首字母缩写应始终全部大写,或全部小写。” xmlHttpRequestXMLHTTPRequest我认为更具可读性。
罗南

3

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

  1. 死刑案件的首字母缩写词:XMLHTTPRequestxmlHTTPRequestrequestIPAddress

  2. 骆驼情况下缩写:ID[entifier]Exe[cutable]App[lication]

ID 是一个例外,对不起但确实如此。

当我看到一个大写字母时,我假设使用首字母缩写词,即每个字母一个单独的词。缩写词的每个字母没有单独的词,因此我使用驼峰式大小写。

XMLHTTPRequest 是模棱两可的,但这是一种罕见的情况,并不是那么模棱两可,所以没关系,规则和逻辑比美更重要。


1

JavaScript Airbnb样式指南对此进行了一些讨论。基本上:

// bad
const HttpRequests = [ req ];

// good
const httpRequests = [ req ];

// also good
const HTTPRequests = [ req ];

因为我通常在全班都读大写的大写字母,所以我倾向于避免这种情况。归根结底,这都是首选。


1

除了@valex所说的以外,我想用给出的这个问题的答案来概括几件事。

我认为一般的答案是:它取决于您使用的编程语言。

夏普

Microsoft 编写了一些准则,在该准则中,这似乎HtmlButton是为这种情况命名类的正确方法。

Java脚本

Javascript有一些带有缩写词的全局变量,并且全部使用大写形式(但有趣的是,并不总是一致的),下面是一些示例:

encodeURIComponent XMLHttpRequest toJSON toISOString


好吧,它是Netscape的老版本,甚至有一些没有camelCase的东西onerror
艾迪(Eddie)

1

免责声明:英语不是我的母亲语气。但是我已经考虑了很长时间了,尤其是在使用节点(驼峰样式)处理数据库时,因为表字段的名称应该被蛇化,这是我的想法:

程序员有两种“缩写词”:

  • 以自然语言,联合国教科文组织
  • 以计算机编程语言(例如)表示tmc and textMessageContainer,通常显示为局部变量。

在编程世界中,自然语言中的所有首字母缩写词均应视为word,原因如下:

  1. 在编程时,我们应该以缩写形式或非缩写形式命名变量。所以,如果我们将其命名功能getUNESCOProperties,这意味着教科文组织是一个缩写(否则它不应该是全部大写字母),但显然,getproperties没有缩略语。因此,我们应该将此功能命名为gunescopgetUnitedNationsEducationalScientificAndCulturalOrganizationProperties,两者都不可接受。

  2. 自然语言在不断发展, 今天的缩写词将成为明天的词,但是程序应独立于这种趋势并永远存在。

顺便说一句,在投票最多的答案中,IO是计算机语言含义的缩写(代表InputOutput),但我不喜欢该名称,因为我认为(计算机语言中的)缩写只能用于命名局部变量,但是顶级类/函数,因此应使用InputOutput而不是IO


“舌头”,而不是“音调”
Dan Dascalescu

0

教科文组织是一个特例,因为它通常(用英语)读成单词而不是首字母缩写,例如UEFA,RADA,BAFTA,与BBC,HTML,SSL不同


1
这是“首字母缩写词”和仅“缩写词”之间的区别;这种区别似乎与整个讨论有关,但是在给出的答案中几乎完全被忽略了。
西蒙

BBC,HTML,SSL和其他首字母缩写词在您听起来每个字母时都更准确地称为缩写。像联合国科教文组织这样的单词发音为真实的缩写。
Lrdwhyt

-2

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

因此,您可以写信getUNESCOProperties。您还可unescoProperties以为变量或UNESCOProperties类编写类(类的约定以大写字母开头)。

如果要将两个首字母缩略词放在一起(例如,一个名为XML HTTP Request的类),此规则将变得棘手。它将以大写字母开头,但是由于XMLHTTPRequest不易阅读(是否为XMLH TTP Request?),并且XMLhttpRequest会违反驼峰约定(是否为XM Lhttp Request?),所以最好的选择是混合大小写:XMLHttpRequest,即实际上W3C使用了什么。但是,不建议使用这种命名方式。对于此示例,HTTPRequest将是一个更好的名称。

由于官方英文单词的标识/身份似乎是ID,尽管不是首字母缩写,所以您可以在此处应用相同的规则。

这个约定似乎很流行,但这只是一个约定,没有对与错。只要尝试遵守约定,并确保您的姓名可读即可。


3
我不相信这整个线程:-)所以它应该是XMLToHtmlConverter但HTMLToXmlConverter?哇...
约瑟夫·萨布(JosefSábl)2016年

1
@JosefSábl,是的,就像那样。关于您的不赞成票,并不是说我喜欢这个约定,但是它确实存在。
赫苏斯·卡雷拉

1
我读到的问题是“在驼峰情况下写缩写词有什么好的惯例”而不是“您能列出所有存在的惯例”吗?而且我认为您提到的惯例非常糟糕,所以我
投票否决了

好吧,问题是“以这种方式编写是否正确?”,并且由于存在许多“正确”的编写方式,因为它只是一个约定,而且该约定非常流行(无论您如何看待它),答案是非常有效的:-)
赫苏斯·卡雷拉
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.