探索命名之美(一)

更新的命名方法,请参见第二篇

"好多人都故意在文章开头引用诗句来表达自己的情怀,我从来不干这种事" —— nimomeng

口、 引子

“你的函数名字太难读懂了!”

“代码不仅仅要实现需求,还应该能让别人看懂。”

“你这个代码命名很不合理!”

很多新码农在工作中总会被老鸟批评程序命名的陋习,我也被批评过很多次。痛定思过,我决定要研究应该怎么命名,为什么要给函数一个好的命名很难,应该怎么样给函数命名。

一、 大牛们怎么看函数命名

Stephen Wolfram[1][2]对于函数命名进行了表述,总结了什么样的命名是好的命名,什么样的命名会给人造成困扰;同时他说,函数命名的过程就像一首短诗,值得仔细推敲,细细品味。

Xah Lee[3]指出,好的命名应该可以让领域外的人一目了然,批评了Lisp语言的命名,如cdr,car,cons,认为这些命名让不懂Lisp的人看得不知所云,也批评了pop、push、shift这些命名,认为这些命名都与数据结构有过于深刻的关联。他认为这些过分含有领域背景的命名都是风格不好的命名。

Marcus M. Edvall[4]认为,命名应该尽量从简,而且推荐用三个字母的前缀来区分各个函数的命名,如ibm公司定义的函数用ibm_xxx来标识,或者文件模块的函数用fil_xxx来标识。
大牛们的观点总结如下:

好的命名 坏的命名
简单,可以望文生句 用词太过宽泛
跨领域,外行一看便知 用词太过技术化
优美的像一首极简的诗 用容易产生歧义的词
在充分理解函数功能的基础上进行 函数本身功能实现有问题

可是,在现实世界中,起名字并不是特别困难的事,为什么在程序语言里给函数命名是一件看起来非常困难的事呢?

二、 人类世界语言VS程序语言

这种困难,归根结底是人类世界的语言和程序语言存在差异,主要在以下三个方面:

人类语言 程序语言
定义不清晰,逐渐细化 完全、清晰、明确的定义
含义不唯一,需要上下文 有名函数具有严格、唯一的含义及使用场景
更容易来造词 只能在已有语言基础上来拼接
  • 人类语言中,词的产生大多是由个人慢慢扩散至群体,并在过程中不断细化其含义。这些词一开始只在一个人或者一小群人里流行,慢慢的口口相传,在传播的过程中不断的细化,最终成为通用、流行的词汇,比如晒工资、房奴等词。人类世界语言的词的含义允许用时间来修正。而程序语言中,一个函数命名一旦被确定,马上会被相关所有函数确定并知晓,这个函数的重命名、修改、删除都会被其它相关函数所察觉。这一过程是瞬时性的,不允许用时间来修正的,且影响力始终不变的。例如Mathematica 1.0(1987)年的很多函数命名至今都没变,其影响力始终如一。
  • 人类语言中词的含义往往不唯一,需要借鉴上下文里其它词来确定其含义。而程序语言中,每个函数都在一个特殊、唯一的场景里被命名,其含义也是唯一、不变的。
  • 人类语言中的字、词允许再造。而在程序语言中,只能基于已有的语言基础去造词,比如大部分基于英语的程序语言,和基于中文的易语言。
    那了解了什么样的函数命名是好的命名,也了解了为什么程序语言命名难,那该怎么对函数进行命名呢?

三、 如何给一个函数命名

我认为,可以通过以下六种方法进行函数命名:

  • 基于已有认知。如果在领域里已经有一些约定俗成的函数命名,最好直接拿来用,比如I18N、L10N等。新词最好由约定俗成的命名所构成,例如PointX。
  • 尽量反映函数的通用性。命名应当能够反映函数的各种用途,如果函数本身是通用的,但是其命名带有某种领域的误导性,那么这种无形中缩小了函数使用范围的命名就是不好的命名。
  • 能望文生义。好的命名应该一目了然,而且针对不同的情况应该做不同的命名。如果针对复杂函数,应当用复杂命名,如EventHandler;针对简单、直接、常见功能用尽量简单的名称,如表示尺寸的Size;针对生僻的函数功能用不很常见的名称,如Through。
  • 由句到词。遇到不知道改怎么命名的函数,先用一句话将函数描述出来,再逐渐提炼、精简句子结构,最终提炼出函数名称。
  • 类比、联想。如果找不到合适的词语,可以采用类比、联想等方式,形象的表述一个函数的含义,比如throw、catch。
  • 易于理解。尽量不用一些容易造成误解的词语,比如live、active等词。
    解决了用什么词给函数命名的问题,但是怎么解决一些复杂情况下,词语组合的顺序问题?来看下Mathematica7的命名分析。

四、 Mathematica 7 命名统计分析

Mathematica是一款科学计算软件,很好地结合了数值和符号计算引擎、图形系统、编程语言、文本系统、和与其他应用程序的高级连接。而且作为一款跨领域软件,Mathematica的函数名能做到让不同领域的人一目了然,其命名很具有参考意义。

分析数据来源:Mathematica线上API的所有函数名

分析方法:通过提取API相关函数名并处理(如把复合词进行切词)并调用金山词霸线上API对所有函数名进行翻译,取第一个释义的词性进行统计,统计结果如下:


mathenmatica7.png

统计结果分析:

通过上述分析结果可以看出,名词和动词占了命名的最大比例。在对其中的名词和动词进行进一步分析之后,结论如下:

  • 表述实体或者属性时,用名词或者名词词组。如Array、CMYKColor。
  • 表述一个动作时,用动词或者动词词组。其中,若动作针对特殊实体,往往将实体名带上,如DeleteCases、FindRoot等;若动作属于通用性动作,则不带实体名,如Insert、Scan。
  • 如果在描述一个实体时,需要突出被描述的实体,则将实体放在前,描述属性或者动作放在后面,如RootReduce、MapIndexed。

五、 总结

文章通过对命名进行研究,总结出一种函数命名方法,并通过对Mathematic的API函数名进行分析,得出各种情况下的词组组合情况。

希望小文能对各位朋友的工作起到帮助!

六、 参考文献

  1. Stephen Wolfram 《Ten Thousand Hours of Design Reviews》
  2. Stephen Wolfram 《The Poetry of Function Naming》
  3. Xah Lee 《The Importance of Terminology‘s Quality In Computer Languages》
  4. Marcus M. Edvall 《How to name a function to minimize function names conflict》
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • 命名实体识别 命名实体的提出源自信息抽取问题,即从报章等非结构化文本中抽取关于公司活动和国防相关活动的结构化信息,...
    我偏笑_NSNirvana阅读 9,969评论 1 35
  • 一、 为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中 常见的...
    IvanRunning阅读 2,299评论 0 2
  • 在做过第三次有关命名的分享后,我决定将命名的方法更新一下。 前情回顾 上一篇,我们说了给函数或者变量命名的几种基本...
    nimomeng阅读 679评论 0 2
  • 2016年7月16日,一个很普通的周六,我开始填之前自己挖的坑--跑步机马拉松全程。为什么说它是坑呢?对于一个从去...
    心理咨询师李彬阅读 366评论 0 1