更新的命名方法驻谆,請參見第二篇
"好多人都故意在文章開頭引用詩句來表達自己的情懷卵凑,我從來不干這種事" —— nimomeng
口、 引子
“你的函數(shù)名字太難讀懂了旺韭!”
“代碼不僅僅要實現(xiàn)需求氛谜,還應該能讓別人看懂∏耍”
“你這個代碼命名很不合理值漫!”
很多新碼農(nóng)在工作中總會被老鳥批評程序命名的陋習,我也被批評過很多次织盼。痛定思過杨何,我決定要研究應該怎么命名,為什么要給函數(shù)一個好的命名很難沥邻,應該怎么樣給函數(shù)命名危虱。
一、 大牛們怎么看函數(shù)命名
Stephen Wolfram[1][2]對于函數(shù)命名進行了表述唐全,總結了什么樣的命名是好的命名埃跷,什么樣的命名會給人造成困擾蕊玷;同時他說,函數(shù)命名的過程就像一首短詩弥雹,值得仔細推敲垃帅,細細品味。
Xah Lee[3]指出剪勿,好的命名應該可以讓領域外的人一目了然贸诚,批評了Lisp語言的命名,如cdr厕吉,car酱固,cons,認為這些命名讓不懂Lisp的人看得不知所云头朱,也批評了pop运悲、push、shift這些命名项钮,認為這些命名都與數(shù)據(jù)結構有過于深刻的關聯(lián)扇苞。他認為這些過分含有領域背景的命名都是風格不好的命名。
Marcus M. Edvall[4]認為寄纵,命名應該盡量從簡鳖敷,而且推薦用三個字母的前綴來區(qū)分各個函數(shù)的命名,如ibm公司定義的函數(shù)用ibm_xxx來標識程拭,或者文件模塊的函數(shù)用fil_xxx來標識定踱。
大牛們的觀點總結如下:
好的命名 | 壞的命名 |
---|---|
簡單,可以望文生句 | 用詞太過寬泛 |
跨領域恃鞋,外行一看便知 | 用詞太過技術化 |
優(yōu)美的像一首極簡的詩 | 用容易產(chǎn)生歧義的詞 |
在充分理解函數(shù)功能的基礎上進行 | 函數(shù)本身功能實現(xiàn)有問題 |
可是崖媚,在現(xiàn)實世界中,起名字并不是特別困難的事恤浪,為什么在程序語言里給函數(shù)命名是一件看起來非常困難的事呢畅哑?
二、 人類世界語言VS程序語言
這種困難水由,歸根結底是人類世界的語言和程序語言存在差異荠呐,主要在以下三個方面:
人類語言 | 程序語言 |
---|---|
定義不清晰,逐漸細化 | 完全砂客、清晰泥张、明確的定義 |
含義不唯一,需要上下文 | 有名函數(shù)具有嚴格鞠值、唯一的含義及使用場景 |
更容易來造詞 | 只能在已有語言基礎上來拼接 |
- 人類語言中媚创,詞的產(chǎn)生大多是由個人慢慢擴散至群體,并在過程中不斷細化其含義彤恶。這些詞一開始只在一個人或者一小群人里流行钞钙,慢慢的口口相傳鳄橘,在傳播的過程中不斷的細化,最終成為通用芒炼、流行的詞匯挥唠,比如曬工資、房奴等詞焕议。人類世界語言的詞的含義允許用時間來修正。而程序語言中弧关,一個函數(shù)命名一旦被確定盅安,馬上會被相關所有函數(shù)確定并知曉,這個函數(shù)的重命名世囊、修改别瞭、刪除都會被其它相關函數(shù)所察覺。這一過程是瞬時性的株憾,不允許用時間來修正的蝙寨,且影響力始終不變的。例如Mathematica 1.0(1987)年的很多函數(shù)命名至今都沒變嗤瞎,其影響力始終如一墙歪。
- 人類語言中詞的含義往往不唯一,需要借鑒上下文里其它詞來確定其含義贝奇。而程序語言中虹菲,每個函數(shù)都在一個特殊、唯一的場景里被命名掉瞳,其含義也是唯一毕源、不變的。
- 人類語言中的字陕习、詞允許再造霎褐。而在程序語言中,只能基于已有的語言基礎去造詞该镣,比如大部分基于英語的程序語言冻璃,和基于中文的易語言。
那了解了什么樣的函數(shù)命名是好的命名损合,也了解了為什么程序語言命名難俱饿,那該怎么對函數(shù)進行命名呢?
三塌忽、 如何給一個函數(shù)命名
我認為拍埠,可以通過以下六種方法進行函數(shù)命名:
- 基于已有認知。如果在領域里已經(jīng)有一些約定俗成的函數(shù)命名土居,最好直接拿來用枣购,比如I18N嬉探、L10N等。新詞最好由約定俗成的命名所構成棉圈,例如PointX涩堤。
- 盡量反映函數(shù)的通用性。命名應當能夠反映函數(shù)的各種用途分瘾,如果函數(shù)本身是通用的胎围,但是其命名帶有某種領域的誤導性,那么這種無形中縮小了函數(shù)使用范圍的命名就是不好的命名德召。
- 能望文生義白魂。好的命名應該一目了然,而且針對不同的情況應該做不同的命名上岗。如果針對復雜函數(shù)福荸,應當用復雜命名,如EventHandler肴掷;針對簡單敬锐、直接、常見功能用盡量簡單的名稱呆瞻,如表示尺寸的Size台夺;針對生僻的函數(shù)功能用不很常見的名稱,如Through痴脾。
- 由句到詞谒养。遇到不知道改怎么命名的函數(shù),先用一句話將函數(shù)描述出來明郭,再逐漸提煉买窟、精簡句子結構,最終提煉出函數(shù)名稱薯定。
- 類比始绍、聯(lián)想。如果找不到合適的詞語话侄,可以采用類比亏推、聯(lián)想等方式,形象的表述一個函數(shù)的含義年堆,比如throw吞杭、catch。
- 易于理解变丧。盡量不用一些容易造成誤解的詞語芽狗,比如live、active等詞痒蓬。
解決了用什么詞給函數(shù)命名的問題童擎,但是怎么解決一些復雜情況下滴劲,詞語組合的順序問題?來看下Mathematica7的命名分析顾复。
四班挖、 Mathematica 7 命名統(tǒng)計分析
Mathematica是一款科學計算軟件,很好地結合了數(shù)值和符號計算引擎芯砸、圖形系統(tǒng)萧芙、編程語言、文本系統(tǒng)假丧、和與其他應用程序的高級連接双揪。而且作為一款跨領域軟件,Mathematica的函數(shù)名能做到讓不同領域的人一目了然虎谢,其命名很具有參考意義。
分析數(shù)據(jù)來源:Mathematica線上API的所有函數(shù)名
分析方法:通過提取API相關函數(shù)名并處理(如把復合詞進行切詞)并調用金山詞霸線上API對所有函數(shù)名進行翻譯曹质,取第一個釋義的詞性進行統(tǒng)計婴噩,統(tǒng)計結果如下:
統(tǒng)計結果分析:
通過上述分析結果可以看出,名詞和動詞占了命名的最大比例羽德。在對其中的名詞和動詞進行進一步分析之后几莽,結論如下:
- 表述實體或者屬性時,用名詞或者名詞詞組宅静。如Array章蚣、CMYKColor。
- 表述一個動作時姨夹,用動詞或者動詞詞組纤垂。其中,若動作針對特殊實體磷账,往往將實體名帶上峭沦,如DeleteCases、FindRoot等逃糟;若動作屬于通用性動作吼鱼,則不帶實體名,如Insert绰咽、Scan菇肃。
- 如果在描述一個實體時,需要突出被描述的實體取募,則將實體放在前琐谤,描述屬性或者動作放在后面,如RootReduce玩敏、MapIndexed笑跛。
五付魔、 總結
文章通過對命名進行研究,總結出一種函數(shù)命名方法飞蹂,并通過對Mathematic的API函數(shù)名進行分析几苍,得出各種情況下的詞組組合情況。
希望小文能對各位朋友的工作起到幫助陈哑!