2011年度最佳代碼“不管你們信不信,我反正信了”

最近有段十分流行的代碼,是從江湖傳聞“身懷八蛋”的鐵道部發言人王勇平同志的一句名言:“不管你們信不信,我反正信了……這是生命的奇跡……它就是發生了”所引申出來的。這段代碼雖然只是在調侃,但是圍繞這段代碼也產生了一些討論(如代碼風格,編程規范等等),在此順手記錄一下,就當無聊罷。

這段代碼是這樣的:

try
{if (you.believe(it) == true || you.believe(it) == false){I.believe(it);}
}
catch (Exception ex)
{throw new Exception("It's a miracle!");
}
finally
{it.justHappened();
}

代碼與原文的對應關系不言自明,從命名風格上看,我們默認其為Java代碼。話題主要是圍繞在if條件的寫法上。

書寫風格

先來看看它的書寫風格問題。我說這段代碼不是老鳥寫的,因為老鳥不會把一個布爾表達式跟true和false直接判斷,而會寫成:

if (you.believe(it) || !you.believe(it))

于是有朋友提出,把布爾表達式跟true或false相比較來的更清晰一些,我表示這話并沒有什么道理,因為這種讀代碼的方式是把視角停留在“數據”層面上:一個布爾表達式返回了布爾型的“數據”,于是把它和另外一個“數據”進行比較。如今的編程都在不斷強調“語義”,“語義”的清晰才是真的清晰。我說Java是一門糟糕的語言,主要原因就是指它的表達能力太差,導致寫出來的代碼體現不出問題的解決方式,讓人們把目光都集中在具體每條語句上了,所謂“見木不見林”。C#等現代語言都在強調“做什么”而不是“怎么做”,語義上就有很大提高了。

回到目前這個具體問題上,if里面的語義是“you.believe(it)”的返回結果,而不是它的值與另外一個布爾常量的比較結果。其實這個觀點我從初中搞信息學競賽時就被老師不斷強調,今天我同樣咨詢了同事,他也贊同我的觀點。如果您還繼續堅持這種寫法不太清晰的話,我只能說“這只是不適應而已,要讓自己適應這類寫法”,很多人還覺得LINQ不清晰呢,小學生還覺得高中數學的解法不清晰呢。

還有朋友認為,作為編碼規范,應該要求這么寫,例如:

if (10 == i)

就是說,把常量寫在比較操作的左邊,并認為“這樣更有普遍意義”。其實這也沒有必要,這個習慣是從C語言時代遺傳下來的“陋習”。在C語言里,如果把常量寫在比較右側,并且一不小心把“比較”操作符(兩個等號)寫成“賦值”操作符(一個等號),也可以編譯通過,但是結果卻大不相同,這給錯誤排查也會帶來許多麻煩。但是,在如今的語言里已經比C語言做的安全多了,所以沒必要制定這種規范。把一種語言的標準帶入另一種語言不叫做“有普遍意義”,只是多余。

代碼含義

然后要談的便是代碼與那句話的“映射”關系了,再來仔細讀一下這個if子句:

if (you.believe(it) || !you.believe(it))
{I.believe(it);
}

從“需求”上來理解,我認為代碼應該保證if內部的代碼一定會執行。那么現在這個需求肯定會滿足嗎?不一定,因為you.believe方法可能是有副作用的:如果它第一次調用返回false,而第二次調用時返回true,則if內部的代碼就會整段略過,這顯然不是鐵道部王發言人的意圖。因此,有同學提議代碼應該是這樣的:

if (true || you.believe(it))

這么做的確可以忽略you.believe(it)的結果,因為它已經被短路了根本不會執行。可能它也能滿足需求,但我想更合理的做法可能應該是:

if (you.believe(it) || true)

這段代碼與之前的區別就在于you.believe(it)一定會被調用一次,但是無所謂其結果是如何,這充分符合天朝某些部門喜歡裝摸作樣“咨詢民意”的狀況。

擴展思考

最后再來一道擴展思考題吧:有人把“你愛,或者不愛我,愛就在那里,不增不減”寫成了一段C#代碼:

if (you.Love(me) || !you.Love(me))
{love++;love--;
}

有人說,這段代碼的if條件本身應該被編譯器優化掉,因此會直接執行if內部的代碼。還有人說,if內部的代碼也會被編譯器優化掉。您怎么看,為什么呢?


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453152.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453152.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453152.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無錫計算機硬件培訓,無錫錫山辦公軟件電腦基礎培訓隨到隨學 學會為止

一、辦公 2個月WORD文字處理;EXCEL電子表格應用;PowerPoint動畫幻燈片制作;國際互聯網、電子郵件、網上傳真;軟件安裝、計算機維護、基礎、常用辦公硬件的使用(打印機、掃描儀、刻錄機、數碼相機等)從事行政、管理、文秘、銷售、…

以太網和局域網的關系

以太網 以太網是當今現有局域網采用的通用通信協議標準,組建于七十年代早期。Ethernet(以太網)是一種傳輸速率為10Mbps的常用局域網(LAN)標準。在以太網中,所有計算機被連接一條同軸電纜上,采用具有沖突檢…

不懂卷積神經網絡?別怕,看完這幾張萌圖你就明白了

本文來自AI新媒體量子位(QbitAI)這篇文章用最簡明易懂的方式解釋了卷積神經網絡(CNN)的基本原理,并繞開了里面的數學理論。 同時,如果想對從頭開始構建CNN網絡之類的問題感興趣,作者推薦去讀《 …

xrd連續掃描和步進掃描_一種提高xrd實驗精度的方法

一種提高xrd實驗精度的方法【專利摘要】本發明公開了一種提高XRD實驗精度的方法,包括如下步驟:步驟1:將待測試樣進行處理至表面平整光潔;步驟2:選用步進掃描方式對待測鋼試樣進行XRD實驗,步進掃描方式的掃描…

2018雙一流排名 計算機,2018中國雙一流高校名單

目前全球范圍內,比較有影響力的世界大學排名包括《QS世界大學排名》、《世界大學學術排名(ARWU)》、《泰晤士高等教育世界大學排名》、《usnews世界大學排名》和CWUR沙特阿拉伯全球大學評級中心世界大學排名。這些排名從各個方面對世界范圍內的高校進行綜合排名&…

交換機和集線器的區別

集線器采用的是共享帶寬的工作方式,簡單打個比如,集線器就好比一條單行道,“10M”的帶寬分多個端口使用,當一個端口占用了大部分帶寬后,另外的端口就會顯得很慢。相反,交換機是一個獨享的通道,它…

移動平臺還有哪些創業機會

這是一個移動互聯網創業的最好時代。 過去的2011年,國內大批創業者為移動互聯網而瘋狂。這個超過200億元的市場牢牢吸引著他們,每天都有新鮮的主意轉化為應用。 移動互聯網時代的創業成本遠小于互聯網時代。創新工場創始人李開復在2011中國移動開發者大…

Swift封裝 滑出式導航欄

前言: 本文將會創建以下幾個主類: DWContainerViewController:這包含了左視圖,中視圖和右視圖控制器的視圖,并處理動畫和滑動等操作。 DWCenterViewController:中央面板。 DWSidePanelViewController&#…

廣東電網計算機專業筆試題目,廣東電網筆試題目

廣東電網筆試題目筆試是一種與面試對應的測試,是以填寫的方法考核應聘者學識水平的重要工具。這種方法可以有效的測量應聘人的基本知識、專業知識、管理知識、綜合分析能力和文字表達能力等素質及能力的差異。下面是小編為大家收集的廣東電網筆試題目,希…

波特率和比特率

波特率(符號率),可以理解為傳輸介質實際能達到的電壓變化,比如每秒可以改變多少次。 比特率,是邏輯層面上每秒能傳輸多少個比特。 考慮最簡單的不歸零編碼,用5伏電壓表示1,-5伏電壓表示0&…

usart和uart 的區別

摘自:https://blog.csdn.net/meic51/article/details/7714847 什么是同步和異步 轉自https://blog.csdn.net/seashine_yan/article/details/71192283轉載于:https://www.cnblogs.com/chulin/p/8661720.html

蘋果產品開發的絕密工作流程

長期以來蘋果產品開發流程在很多方面都籠罩著一層神秘的面紗,而在AdamLashinsky新發行的《InsideApple:HowAmerica’sMostAdmired–andSecretive–CompanyReallyWorks》一書中對這些流程有所涉及。這本書同時談論了蘋果公司各個不同的方面,包括其理念、招…

Linux系統集群架構線上項目配置實戰(一)

項目整體介紹 **整個項目包括以下幾個應用工程** 1、 用戶APP 2、 商家APP 3、 業務平臺管理后臺 4、 商家業務管理后臺 5、 官網 **整體項目規劃設計如下** 1、 用戶APP采用JAVA環境布署,初始環境兩臺服務器,實現負載均衡與高可用,前端…

如何確定autosar的版本_AUTOSAR編碼指南(中文版)

在汽車應用領域,軟件開發變得越來越重要。隨著安全、環境以及便利性需求的增長,車輛中應用電子系統的數量也在急速增長。其中有90%的創新應用都是基于軟件驅動的電子組件。而這些組件的研發成本占車輛開發成本的40%,快速穩定的發展需要整合更…

3個月計算機考研,【圖片】(重開)三個月考研成功的心路歷程 -南郵計算機【南京郵電大學研究生院吧】_百度貼吧...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓這個帖子教你如何在較短時間拿到大部分的分值。聲明:這個經驗是我個人的經歷可能對有些人不適合 時間充裕的還是老老實實打基礎,按部就班的三輪復習。18年考研 南郵 初試數據結構 復試微機原理 。我是國慶之…

PS把一張白色背景的圖片設為透明

方法一: 1.雙擊圖層縮略圖上的小鎖圖標(注意,這里不要拖動小鎖進行刪除鎖定),彈出“新建圖層”,確定 2.右鍵左側第四個功能菜單,選擇魔棒工具 3.用魔棒工具在白色背景區域點擊一下,選…

HTML5 webfont字體圖標的使用

2019獨角獸企業重金招聘Python工程師標準>>> 一.參考文獻 1.http://www.cnblogs.com/yes-V-can/p/5716853.html 2.http://blog.csdn.net/zhouwangling_/article/details/53096649 二.html使用方法 1.下載字體 網上百度自己要使用的字體,一般下載的是ttf格…

算法導論中英文版下載

算法導論: 學過計算機的都知道,這本書可以說是全世界最權威的算法課程的大學課本了,基本上全世界的名牌大學用的教材都是它。這本書一共四位作者,Thomas H. Cormen,Charles E. Leiserson 和 Ronald L.Rivest 是來自 MI…

javaweb不同用戶需要幾張表_程序員必備2020版:JavaWeb快速進階全套教程

Java Web應用由一組Servlet、HTML頁、類、以及其它可以被綁定的資源構成。它可以在各種供應商提供的實現Servlet規范的Servlet容器中運行。JavaWeb項目簡單來說就是一個應用程序,比如每天打開的QQ、微信、百度地圖等,這些都是應用程序。有很多同學反應Ja…