常见的命名公约
文章来源: 常见的命名公约
内容取自: Common Util's Javadoc - Convention
一、烤串命名
this-is-an-example-name
Kebab Case,有时也叫“Lisp Case”、“Brochette Case”、“Spinal Case”、“Param Case”、“Dash Case”、 “Hyphen Case”、“CSS Case”或“Caterpillar Case”。即多个小写单词间使用连字符(中划线)连接。多个单词被中划线“穿过”看起来就像一串烤串,因此而得名。这里决定采用“Kebab Case”命名是因为该叫法自2012年之后 越来越流行,且当通过搜索引擎搜索时“Kebab Case”明显比其它叫法的搜索结果多很多,Google Trends也表明该叫法比其它叫法更受欢迎。
烤串命名广泛应用于URL路径命名、HTML属性(Property和Attribute)命名、CSS选择器和KV(属性名&属 性值)命名,Unix命令和包也经常采用该命名方式。另外COBOL(1959年)、Forth(1970年)和Lisp(1958年) 编程语言的开发者们几乎都采用该命名方式。
二、大写烤串命名
THIS-IS-AN-EXAMPLE-NAME
Screaming Kebab Case(或“尖叫烤串命名”),有时也叫“Cobol Case”、“Train Case(注意:‘HTTP Header Case’ 也被称为‘Train Case’)”。除了所有字母为大写外和“Kebab Case”没有不同。
随着计算机网络的出现,在社交媒体上完全用大写字母输入消息通常被认为是大喊大叫或其他不礼貌、争论行 为,因此所有字母大写有时也被称为“尖叫”或“大喊”,所以我们称这种命名公约为“尖叫烤串命名”。
三、驼峰命名
thisIsAnExampleName
Camel Case,更精确的叫法为“小驼峰命名(Lower Camel Case / Dromedary Case)”,因其突出的大写字母像骆驼的驼 峰而得名。常见的“iPhone”、“eBay”即为小驼峰命名例子,它也是Java编程语言中主要使用的命名方式。关于第一个单词 的首字母是否大写定义并不明确,为了明确两种情况,人们起了一些别名以示区分,其中微软公司的开发者命名指南提供了一 个不错的方案,即用“Pascal Case”表示“大驼峰命名”,而“Camel Case”专指 “小驼峰命名”,本命名公约类也采用方案。
使用驼峰命名(包含大驼峰、小驼峰)表示网站URL时可以避免地址太长和可读性差,如空格在URL中会被编码为“%20”, 由于驼峰命名中没有空格,故不存在该问题。当首字母缩略词(Acronym)出现时,驼峰命名会存在一些弊端,如“HTTP SID”、 “DVD Player”和“parse DBM XML”采用驼峰命名将分别变为“HTTPSID”、“DVD Player”和“parseDBMXML”, 这将使得读者难以甚至无法分辨单词边界,就像“HTTPSID”可能是“HTTP SID”也可能是“HTTPS ID”。出于这个原因, 将缩略词当作普通的小写单词来处理的方式很受欢迎,如“HttpSid”、“DvdPlayer”、“parseDbmXml”,然而这样也 带来了难以识别是普通单词还是首字母缩略词这样的新问题。
目前主流的驼峰命名规范可以参考SUN公司于1997年发布的Java代码公约 (已多年未更新)、谷歌Java风格指南 (最常用样式指南之一,但其2个空格缩进的约定令许多开发者反对)、微软.NET命名指南和安卓Java风格规则。
Java中并没有一个关于缩写词(Abbreviation)和首字母缩略词该如何命名的约定,由于Java和.NET的命名方式非 常相似,因此可借鉴微软.NET命名指南。 简单说,微软.NET命名指南 指出,当首字母缩略词的字母长度超过2时将其作为普通单词对待,即不超过2个字母的首字母缩略词(如“IO”)在使用 时应全部大写(如“getIOStream”),而超过2个字母的首字母缩略词(如“HTML”)在使用时应当作为普通单词来对 待(如“myHtmlTag”)。 另外微软.NET命名指南 也规范了复合词(Compound Word,也称“合成词”)的命名约定。复合词根据“封闭复合词”(Closed-form Compound Word) 和“非封闭复合词”两种类型分别做不同的处理。对于封闭复合词(如“callback”、“endpoint”、“metadata”、 “namespace”)应将它们视为单个单词处理(即“Callback”、“Endpoint”、“Metadata”、“Namespace”), 请勿将复合词中的每个单词首字母大写(错误演示“CallBack”、“EndPoint”、“MetaData”、“NameSpace”)。 一些非封闭复合词的示例单词是:“fileName”、“logOff”、“signIn”、“userName”、“whiteSpace”。关于 如何确认符合词是否以闭合形式书写,微软的给出的建议是查阅英文词典,同时文档中也给出了一些常见的复合词清单以供参考。
虽然不同厂商制定的命名规范有所不同,但有些概念似乎达成了共识。例如,建议尽可能在命名中使用完整的单词而不是 使用首字母缩略词或缩写词,极其广泛地使用的首字母缩略词或缩写词(例如“URL”、“HTML”、“XML”,它们的全称反 而使人更难以识别)除外。
尽管采用一致的命名约定可以获得许多好处,但在PHP、.NET、Java等主流语言的官方库中仍不乏出现命名混乱的现象。 常见的如.NET平台中位于System.Data.Common命名空间的DbConnection类和位于System 命名空间的DBNull类,两者分别采用了“Db”和“DB”来命名类名;Visual Studio SDK中位于MSXML 命名空间的IXMLHttpRequest接口采用两种方式命名“XML”和“Http”;在PHP库中存在的DOMDocument 和DomXPath两个类也分别采用“DOM”和“Dom”两种不一致的形式来命名类名;Java中的驼峰大小写也十分 不一致,位于java.net包下的HttpURLConnection类呈现了“Http”和“URL”两种命名方式, 其类库中也存在大量命名不一的如“getID”、“getId”这样的混乱现象。值得一提的是,.NET从3.0/3.5版本开始出现由“ID” 变为“Id”的命名趋势,在Java 8版本中也越来越多的使用“getId”命名,最新的Java API似乎已经决定只大写第一 个字母(如“DosFileAttributes”、“IsoChronology”),可见微软的PascalCase约定将成为首选。在Java标 准库中,4个字母的首字母缩略词按照普通单词来对待,这点与.NET保持一致,对于2个字母的首字母缩略词也同.NET保 持一致采用全部大写方式命名。对于2个字母的缩写词Java并没有实际的标准,对于3个字母的首字母缩略词,可以像.NET 那样首字母大写,也可以像Java类库那样全部大写(“Jar(全称Java archive)”是一个混乱的特例),无论哪种命 名方式,在项目中保持一致性将会是一个良好的约定。
众说纷纭的“ID”是一个典型的特殊情况。虽然微软.NET命名指南 不建议使用缩写词,但唯独允许了两个特例,即“ID(identity或identifier的缩写)”和“OK(okay的缩写)”,其 大驼峰应写作“Id”、“Ok”,小驼峰应写作“id”、“ok”,这也与JavaScript中的getElementById函数、 JPA(Java Persistence API)中的jakarta.persistence.Id(原javax.persistence.Id) 注解命名一致。具有争议的是,“ID”同时也是“identity document”的首字母缩略词,很难说某一个“ID”具体指缩写 词还是首字母缩略词。
该工具提供非英文命名的驼峰支持,常见不区分大小写的有中文汉字、阿拉伯字母、阿拉伯数字等,区分大小写的有英文 字母、俄语字母、法语字母、西班牙字母等。这里不区分大小写的字符按照一同(若有)出现的区分大小写的字符做决定, 以不区分大小写的中文汉字和区分大小写的英文字母为例:
若所有英文字母均为大写,则中文汉字按大写处理,如“URL转URI”中的汉字视为大写,即整个字符串为一个整体;
若所有英文字母均为小写,则中文汉字按小写处理,如“url转uri”中的汉字视为小写,即整个字符串为一个整体;
若英文字母既存在大写又存在小写,则中文汉字按大写处理,如“myUrl地址”被视为由“my”、“Url”、“地址”三个部分组成。
四、帕斯卡命名
ThisIsAnExampleName
Pascal Case,同属“驼峰命名”,也称为“大驼峰命名(Upper Camel Case / Capital Camel Case)”,或称 “Bumpy Case”、“Studly Case”、“Studly Caps”。除第一个单词的首字母为大写外和“Camel Case” 没有不同。
五、HTTP头命名
This-Is-An-Example-Name
HTTP Header Case,有时也叫“Train Case(注意:‘Screaming Kebab Case’ 也被称为‘Train Case’)”,除了每个单词的首字母为大写外和“Kebab Case”没有不同。 正如其名,该命名方式主要用在HTTP协议头的键(Key)命名。
“HTTP Header Case”名字的起源可能来自一个叫camel-snake-kebab的Clojure库,该库的作者使用该名字称呼这种命名方式。
六、蛇形命名
this_is_an_example_name
Snake Case,因为它很像蛇的长身体而得名,有时称“Pothole Case”。由于该命名方式经常在C语言中使用,所以也有 人称之为“C Case”。Python代码风格指南称其为“Lower Case With Underscores”。这种命名方式最早可追溯至1960年代晚期,它与C语言有特别的关系, 与著名的“驼峰命名”形成明显对比。尽管该命名方式很流行,然而它并没有一个较为官方的名字。
根据网络记载,该词最早出现是2004年于Ruby社群网站上由一名为“Gavin Kistner”的人提到,他写道:“BTW... what do you call that naming style? snake_case? That's what I'll call it until someone corrects me(顺便说一下,你们怎么称呼这种命名方式?snake_case吗?在没人纠正我之前,我将会这么称呼它)”。 不确定的消息称,前英特尔(也许是微软)工程师“Jack Dahlgren”表示他们在2002就已经使用这种叫法了。这个名 字可能是在多个社区中独立衍生出来的。
七、大写蛇形命名
THIS_IS_AN_EXAMPLE_NAME
Screaming Snake Case(或“尖叫蛇形命名”),有时也叫“Capitalized With Underscores”、“Upper Case(注意:‘Upper Flat Case’ 也被称为‘Upper Case’)”。除了所有字母为大写外和“Snake Case”没有不同。
随着计算机网络的出现,在社交媒体上完全用大写字母输入消息通常被认为是大喊大叫或其他不礼貌、争论行为,因此 所有字母大写有时也被称为“尖叫”或“大喊”,所以我们称这种命名公约为“尖叫蛇形命名”。
由于该命名方式常见于对常量进行命名或在C语言预处理器里的宏命名,故有时也被称为“Constant Case”或“Macro Case”。
八、驼峰蛇形命名
this_Is_An_Example_Name
Camel Snake Case。小驼峰和蛇形命名的混合方式,即可视为驼峰命名每个单词间添加下划线或蛇形命名除首单词外每个单词首字母大写。
九、帕斯卡蛇形命名
This_Is_An_Example_Name
Pascal Snake Case,有时也叫“Mixed Case With Underscores”。除第一个单词的首字母为大写外和 “Camel Snake Case”没有不同。
该命名方式典型的用例是Ada语言标识符命名,也因此有人称之为“Ada Case”。
注意:有人也能称这种命名方式为“Title Case”,但在这里“Title Case”为另一种命名公约。
十、平坦命名
thisisanexamplename
Flat Case,有人称之为“Mumble Case”。该命名方式只是将单词以全小写形式直接拼接在一起,看起来十分平坦,故因此得名,它也被形象地称为“Lazy Case(懒惰命名)”。
该命名方式可读性较差,Java的包命名是该命名方式的一个典型用例。
十一、大写平坦命名
THISISANEXAMPLENAME
Upper Flat Case,有时也叫“Upper Case(注意:‘Screaming Snake Case’ 也被称为‘Upper Case’)”。除所有字母大写外和“Flat Case”没有不同。
---------- The End ----------
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。