上班处理教研数据,看到一个词条是“SCREAMIHNG_SNAKE_CASE”,给姐吓一大跳,这东西也能当词条?查了一下,蒽,可以,这是编程中的大小写命名规则之一。好,那么又可以查资料写博客发给写了一千万年代码的朋友们看了(是否本人最爱做的事情之一是班门弄斧...

已知咱们在写程序的时候需要给变量命名,但变量名里是不允许有空格的,如果有空格的话,像我这样又脆弱又非要写程序的人就会跟程序一起崩溃。那怎么办呢?我要命名的变量不止一个词,我难道不写程序了吗?I wish...

于是那些非要硬着头皮写程序的没有情绪的人(蒽不是)就慢慢规定了基本的四大类命名法则,提升代码的易读性、易认性、程序效率和可维护性(摘自命名规则)。

很有趣的是人们一开始在语言文字中加入大写也是为了提升文字的可读性,这部分内容在献给小羊的英语教材:学习代码,理解代码,成为代码,超越代码里讲case的时候讲过,有兴趣的老师可以再去品鉴一下这篇传世之作。

更有趣的是居然真的有专业的研究人员基于各种命名法开展了学术研究,比如这篇2010年发表在IEEE上的文章《An Eye Tracking Study on camelCase and under_score Identifier Styles》literally用eye-tracking的技术来分析了camelCase和snake_case两者的可读性...学术界...(蒽对不起已毕业没有看学术文章的权限了并且也不想去Sci-Hub上下载因为不想想起读研写论文的trauma所以随机在评论区蹲一个男大女大把结果喂给我)。

四(五)种规则

snake_case 蛇形命名法
所有单词用"_"连接,就像一条伏地前行的蛇蛇(snake),曾经也叫underscore_case,underscore就是下划线的意思,在Python,Ruby和JavaScript里比较常用,用以命名变量,也有函数名。
用本人的Telegram Channel名为例,就是:rabbit_hole_bonanza

有两个分支,一个是lower_snake_case,似乎是更常见的命名法,所有单词全都小写。
另一个分支,是UPPER_SNAKE_CASE,也被戏谑地称作文章引言里的SCREAMING_SNAKE_CASE,因为在英语语境里,当我们想发消息朝着人尖叫的时候,我们就在消息里把所有字母都大写,起到一种震撼的效果:
DUDE, WHAT THE ACTUAL FUCK?!

kebab-case 烤肉串命名法
所有单词用"-"连接,就像一串(中东)烤肉串(kebab),曾经也叫dash-case(英语中的破折号就叫dash) / hypen-case(连字符) / Lisp-case(Lisp是一种编程语言,我猜可能就是用的这样的规则来命名变量吧),一般仅在URL,文件名和HTML/CSS的class名里出现.
例如:rabbit-hole-bonanza

本博客的所有url命名也都是用的这个规则,有兴趣可以抬头看看这篇文章的网址,如果更有兴趣我非常欢迎你把所有网址都读完,也许会收获一些彩蛋(当然也有可能你不觉得那些是彩蛋but anyways我承认这就是我自说自话的人生)。

PascalCase 帕斯卡命名法
Pascal就和上文的Lisp一样,也是一种编程语言,在C#,Java和TypeScript里更常用,拿来给class和type命名。

但是!PascalCase之所以会被叫PascalCase是有更细致的原因的,这一段是我在StackOverflow的一个讨论里和learn.microsoft.com的Blog Archive里翻到的趣味历史

简言之就是:
【原因1】在1970年代到1990年代的时候,西方世界已经比较流行用PascalCase来给一切东西命名了,品牌名,当然也包括变量名。
【原因2】当时的Pascal语言是一个比较常用的开发语言,变量命名通常遵从这种规则。
【原因3】当Turbo Pascal(一个软件开发产品)被发明时,原开发者Anders Heilsberg觉得PascalCase很适合拿来当作这种命名规则的官方名。

于是PascalCase就出现了,后来才出现的下文中的camelCase。

camelCase 驼峰命名法
所有单词直接拼在一起,但第一个单词首字母小写、其他单词首字母大写,就像一只完整的甚至过于长的骆驼(camel),跟PascalCase的区别仅在第一个单词的首字母大小写与否,在JavaScript,,Java和C#里比较常用,用以命名变量,也有函数名。
例如:rabbitHoleBonanza
当然还有更常见的,iPhone和eBay!

Hungarian Notation 匈牙利命名(标注)法
这是本人见所未见闻所未闻的命名法,有没有聪明的人已经发现这里的英语单词变成了notation而不是case?case的意义范围,只是作大小写、是否加符号、加什么符号的区分,而notation一词的重点,则放在了标注上。

Hungarian Notation背后有一串有趣的故事,以下内容融合自维基百科CSDN相关词条。

匈牙利命名法由一位叫Charles Simonyi的代码哥发明,他后来当上了微软的总设计师,谢谢你代码哥。很容易猜到这个命名法里的“匈牙利”是在指代他的国籍,但曾经是苹果初代开发工程师的Andy Hertzfel也锐评道:“(这种命名法)让变量看上去像是一门读不懂的语言”。

匈牙利的语言中,姓在前、名在后,就跟咱们老中一样!所以Charles Simonyi的匈牙利名其实是Simonyi Károly,在他发明的匈牙利命名法中,变量的命名规则也遵守了“属性 + 类型 + 描述”的规则,是否和姓 + 名有异曲同工之妙?

匈牙利命名法也有两个分支,一个是Systems Hungarian - 系统匈牙利命名法,变量的前缀用来标记type,另一个是Apps Hungarian - 应用匈牙利命名法,变量的前缀用来标记purpose。具体的规则可以参考这篇博文,有对应关系还有代码示例,看了就能明白(对因为我写不出来)。

不过这个命名法现在好像已经obsolete了(也就是没什么人在用了),比较显著的几个原因,可以参考上文挂的维基百科的链接,因为我也看不懂嘿嘿~

为什么这么多语言有不同的命名法?

查了半天资料我能得出的结论只有。。。为了标准化。。。但标准被谁制订、为什么制订等问题我难以回答。。。有没有懂行甚至懂历史的代码哥出手相助。。。

其实上文写的这些xx命名法在xx语言里更常用的规则,都只是一些比较通用的习俗,具体的命名法甚至要看公司、组织、社群,甚至还要看个人。

我写了半天把这个文章拿给一个代码哥看(小流量测,蒽),收获哥们回复:你学这个干啥,我们都一般用驼峰,但不用也没人说你,只是坚持用这个的话会有人夸你代码写得好,有规则。

世界已经悄悄被我们P人占领。