年度最佳代码“不管你们信不信,反正我信了”
最近有段十分流行的代碼,是從江湖傳聞“身懷八蛋”的鐵道部發(fā)言人王勇平同志的一句名言:“不管你們信不信,反正我信了……這是生命的奇跡……它就是發(fā)生了”所引申出來的。這段代碼雖然只是在調(diào)侃,但是圍繞這段代碼也產(chǎn)生了一些討論(如代碼風(fēng)格,編程規(guī)范等等),在此順手記錄一下,就當(dāng)無聊罷。
這段代碼是這樣的:
代碼與原文的對應(yīng)關(guān)系不言自明,從命名風(fēng)格上看,我們默認(rèn)其為Java代碼。話題主要是圍繞在if條件的寫法上。
書寫風(fēng)格
先來看看它的書寫風(fēng)格問題。我說這段代碼不是老鳥寫的,因?yàn)槔哮B不會(huì)把一個(gè)布爾表達(dá)式跟true和false直接判斷,而會(huì)寫成:
于是有朋友提出,把布爾表達(dá)式跟true或false相比較來的更清晰一些,我表示這話并沒有什么道理,因?yàn)檫@種讀代碼的方式是把視角停留在“數(shù)據(jù)”層面上:一個(gè)布爾表達(dá)式返回了布爾型的“數(shù)據(jù)”,于是把它和另外一個(gè)“數(shù)據(jù)”進(jìn)行比較。如今的編程都在不斷強(qiáng)調(diào)“語義”,“語義”的清晰才是真的清晰。我說Java是一門糟糕的語言,主要原因就是指它的表達(dá)能力太差,導(dǎo)致寫出來的代碼體現(xiàn)不出問題的解決方式,讓人們把目光都集中在具體每條語句上了,所謂“見木不見林”。C#等現(xiàn)代語言都在強(qiáng)調(diào)“做什么”而不是“怎么做”,語義上就有很大提高了。
回到目前這個(gè)具體問題上,if里面的語義是“you.believe(it)”的返回結(jié)果,而不是它的值與另外一個(gè)布爾常量的比較結(jié)果。其實(shí)這個(gè)觀點(diǎn)我從初中搞信息學(xué)競賽時(shí)就被老師不斷強(qiáng)調(diào),今天我同樣咨詢了同事,他也贊同我的觀點(diǎn)。如果您還繼續(xù)堅(jiān)持這種寫法不太清晰的話,我只能說“這只是不適應(yīng)而已,要讓自己適應(yīng)這類寫法”,很多人還覺得LINQ不清晰呢,小學(xué)生還覺得高中數(shù)學(xué)的解法不清晰呢。
還有朋友認(rèn)為,作為編碼規(guī)范,應(yīng)該要求這么寫,例如:
就是說,把常量寫在比較操作的左邊,并認(rèn)為“這樣更有普遍意義”。其實(shí)這也沒有必要,這個(gè)習(xí)慣是從C語言時(shí)代遺傳下來的“陋習(xí)”。在C語言里,如果把常量寫在比較右側(cè),并且一不小心把“比較”操作符(兩個(gè)等號(hào))寫成“賦值”操作符(一個(gè)等號(hào)),也可以編譯通過,但是結(jié)果卻大不相同,這給錯(cuò)誤排查也會(huì)帶來許多麻煩。但是,在如今的語言里已經(jīng)比C語言做的安全多了,所以沒必要制定這種規(guī)范。把一種語言的標(biāo)準(zhǔn)帶入另一種語言不叫做“有普遍意義”,只是多余。
代碼含義
然后要談的便是代碼與那句話的“映射”關(guān)系了,再來仔細(xì)讀一下這個(gè)if子句:
從“需求”上來理解,我認(rèn)為代碼應(yīng)該保證if內(nèi)部的代碼一定會(huì)執(zhí)行。那么現(xiàn)在這個(gè)需求肯定會(huì)滿足嗎?不一定,因?yàn)閥ou.believe方法可能是有副作用的:如果它第一次調(diào)用返回false,而第二次調(diào)用時(shí)返回true,則if內(nèi)部的代碼就會(huì)整段略過,這顯然不是鐵道部王發(fā)言人的意圖。因此,有同學(xué)提議代碼應(yīng)該是這樣的:
這么做的確可以忽略you.believe(it)的結(jié)果,因?yàn)樗呀?jīng)被短路了根本不會(huì)執(zhí)行。可能它也能滿足需求,但我想更合理的做法可能應(yīng)該是:
這段代碼與之前的區(qū)別就在于you.believe(it)一定會(huì)被調(diào)用一次,但是無所謂其結(jié)果是如何,這充分符合天朝某些部門喜歡裝摸作樣“咨詢民意”的狀況。
擴(kuò)展思考
最后再來一道擴(kuò)展思考題吧:有人把“你愛,或者不愛我,愛就在那里,不增不減”寫成了一段C#代碼:
有人說,這段代碼的if條件本身應(yīng)該被編譯器優(yōu)化掉,因此會(huì)直接執(zhí)行if內(nèi)部的代碼。還有人說,if內(nèi)部的代碼也會(huì)被編譯器優(yōu)化掉。您怎么看,為什么呢?
————
編輯?∑Gemini
?來源:算法數(shù)學(xué)之美
?泰勒定理的奇聞軼事
?丘成桐:漫談微分幾何
?Leibniz 如何想出微積分?(一)
?線性相關(guān)和秩的物理意義
?數(shù)學(xué)史上你認(rèn)為最丑陋的公式是什么?
?陶哲軒談什么是好的數(shù)學(xué)
?田淵棟:數(shù)學(xué)的用處(下篇)
?你絕對沒想過原來數(shù)學(xué)家這么流氓,一言不合就進(jìn)行暴力證明
?世界上最牛的五篇博士論文
?數(shù)學(xué)中有哪些巧合讓人眼前一亮?
?算法立功!清華畢業(yè)教授美國被搶車,警察無能為力自己用“貪心算法”找回
?學(xué)術(shù)史上的奇文:怎樣用數(shù)學(xué)抓獅子
?臺(tái)大教授的反思:最難的一課 我們卻沒教給學(xué)生
?麻省理工學(xué)院(MIT)研究生學(xué)習(xí)指導(dǎo)—— 怎樣做研究生
?分享 數(shù)學(xué),常識(shí)和運(yùn)氣 ——投資大師詹姆斯·西蒙斯2010年在MIT的講座
算法數(shù)學(xué)之美微信公眾號(hào)歡迎賜稿
稿件涉及數(shù)學(xué)、物理、算法、計(jì)算機(jī)、編程等相關(guān)領(lǐng)域,經(jīng)采用我們將奉上稿酬。
投稿郵箱:math_alg@163.com
總結(jié)
以上是生活随笔為你收集整理的年度最佳代码“不管你们信不信,反正我信了”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 继北大“鸿hao之志”后,清华出现“热列
- 下一篇: 【文末有福利】5个字极简入门朴素贝叶斯模