探索命名之美(一)

更新的命名方法驻谆,請參見第二篇

"好多人都故意在文章開頭引用詩句來表達自己的情懷卵凑,我從來不干這種事" —— 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)計結果如下:


mathenmatica7.png

統(tǒng)計結果分析:

通過上述分析結果可以看出,名詞和動詞占了命名的最大比例羽德。在對其中的名詞和動詞進行進一步分析之后几莽,結論如下:

  • 表述實體或者屬性時,用名詞或者名詞詞組宅静。如Array章蚣、CMYKColor。
  • 表述一個動作時姨夹,用動詞或者動詞詞組纤垂。其中,若動作針對特殊實體磷账,往往將實體名帶上峭沦,如DeleteCases、FindRoot等逃糟;若動作屬于通用性動作吼鱼,則不帶實體名,如Insert绰咽、Scan菇肃。
  • 如果在描述一個實體時,需要突出被描述的實體取募,則將實體放在前琐谤,描述屬性或者動作放在后面,如RootReduce玩敏、MapIndexed笑跛。

五付魔、 總結

文章通過對命名進行研究,總結出一種函數(shù)命名方法飞蹂,并通過對Mathematic的API函數(shù)名進行分析几苍,得出各種情況下的詞組組合情況。

希望小文能對各位朋友的工作起到幫助陈哑!

六妻坝、 參考文獻

  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》
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惊窖,隨后出現(xiàn)的幾起案子刽宪,更是在濱河造成了極大的恐慌,老刑警劉巖界酒,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圣拄,死亡現(xiàn)場離奇詭異,居然都是意外死亡毁欣,警方通過查閱死者的電腦和手機庇谆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凭疮,“玉大人饭耳,你說我怎么就攤上這事≈唇猓” “怎么了寞肖?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長衰腌。 經(jīng)常有香客問我新蟆,道長,這世上最難降的妖魔是什么右蕊? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任栅葡,我火速辦了婚禮,結果婚禮上尤泽,老公的妹妹穿的比我還像新娘欣簇。我一直安慰自己,他們只是感情好坯约,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布熊咽。 她就那樣靜靜地躺著,像睡著了一般闹丐。 火紅的嫁衣襯著肌膚如雪横殴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音衫仑,去河邊找鬼梨与。 笑死,一個胖子當著我的面吹牛文狱,可吹牛的內容都是我干的粥鞋。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼瞄崇,長吁一口氣:“原來是場噩夢啊……” “哼呻粹!你這毒婦竟也來了灭美?” 一聲冷哼從身側響起贵扰,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抄谐,沒想到半個月后摹蘑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體筹燕,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年衅鹿,在試婚紗的時候發(fā)現(xiàn)自己被綠了撒踪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡塘安,死狀恐怖糠涛,靈堂內的尸體忽然破棺而出援奢,到底是詐尸還是另有隱情兼犯,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布集漾,位于F島的核電站切黔,受9級特大地震影響,放射性物質發(fā)生泄漏具篇。R本人自食惡果不足惜纬霞,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驱显。 院中可真熱鬧诗芜,春花似錦、人聲如沸埃疫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栓霜。三九已至翠桦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間胳蛮,已是汗流浹背销凑。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工丛晌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人斗幼。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓澎蛛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親孟岛。 傳聞我的和親對象是個殘疾皇子瓶竭,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容

  • 命名實體識別 命名實體的提出源自信息抽取問題,即從報章等非結構化文本中抽取關于公司活動和國防相關活動的結構化信息渠羞,...
    我偏笑_NSNirvana閱讀 10,217評論 1 35
  • 一斤贰、 為什么需要命名空間(問題提出) 命名空間是ANSIC++引入的可以由用戶命名的作用域,用來處理程序中 常見的...
    IvanRunning閱讀 2,353評論 0 2
  • 在做過第三次有關命名的分享后次询,我決定將命名的方法更新一下荧恍。 前情回顧 上一篇,我們說了給函數(shù)或者變量命名的幾種基本...
    nimomeng閱讀 703評論 0 2
  • 2016年7月16日,一個很普通的周六盒卸,我開始填之前自己挖的坑--跑步機馬拉松全程骗爆。為什么說它是坑呢?對于一個從去...
    心理咨詢師李彬閱讀 372評論 0 1