成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

高質量代碼的特征

開發 開發工具
許多具有代碼潔癖的程序員將代碼可讀性視為神圣不可侵犯的真理,并奉其為高質量代碼的最重要特征,封上了“神壇”。殊不知,Uncle Bob在Clean Code的第一章就通過別人之口對所謂“Clean Code”進行了正名:所謂整潔代碼并非僅僅是“清晰”這么簡單。

回想起來,我覺得我們似乎在誤讀Uncle Bob的Clean Code,至少我們錯誤地將所謂Clean與可讀性代碼簡單地劃上了等號。尤為不幸的是,在Clean Code一書中,從第二章到第五章都圍繞著可讀性代碼做文章,于是加深了這種錯誤的印象。

[[196846]]

許多具有代碼潔癖的程序員將代碼可讀性視為神圣不可侵犯的真理,并奉其為高質量代碼的最重要特征,封上了“神壇”。殊不知,Uncle Bob在Clean Code的***章就通過別人之口對所謂“Clean Code”進行了正名:所謂整潔代碼并非僅僅是“清晰”這么簡單。

按照Kent Beck的簡單設計規則,排在***位的其實不是可讀性,而是“通過所有測試”。其中潛藏的含義是滿足用戶正確的需求,因為測試可以看做是用戶提出的需求。這個需求不僅僅是業務上的,還包括質量屬性的需求,例如性能、安全等屬性。

消除重復和提高表達力這兩點,有時候會互相促進,去除了冗余的代碼,會讓代碼變得更加清晰;然而,有時候卻又互相沖突,消除重復的成本可能會比較高,導致提取了太多細碎微小的實體,反而增加了閱讀障礙。

故而我常常將Uncle Bob提出的“函數的***規則是要短小。第二條規則是還要更短小。”看做是一種矯枉過正的強迫。對于那種喜歡編寫大函數的程序員而言,確實需要時刻銘記這一原則,但切記不要將其視為***準則。保證函數短小是有前提的,仔細閱讀Kent Beck的簡單設計原則,依其重要順序:

  1. 能通過所有測試;
  2. 沒有重復代碼;
  3. 體現設計者的意圖;
  4. 若無必要,勿增實體(方法、函數、類等)。

如果程序滿足了客戶需求,沒有重復代碼,函數的表達已經足夠清晰地體現設計者意圖,為何還要不斷地提取函數,使得函數變得極為短小呢?真正有意義的原則是“讓函數只做一件事情”。

正因為此,在Clean Code書中,Uncle Bob展示的對FitNesse中HtmlUtil.java的第二次重構并無必要。在經過***次重構后,代碼如下所示:

  1. public static String renderPageWithSetupsAndTeardowns(PageData pageData, boolean isSuite) throws Exception { 
  2.     boolean isTestPage = pageData.hasAttribute("Test"); 
  3.     if (isTestPage) { 
  4.         WikiPage testPage = pageData.getWikiPage(); 
  5.         StringBuffer newnewPageContent = new StringBuffer(); 
  6.         includeSetupPages(testPage, newPageContent, isSuite); 
  7.         newPageContent.append(pageData.getContent()); 
  8.         includeTeardownPages(testPage, newPageContent, isSuite); 
  9.         pageData.setContent(newPageContent.toString()); 
  10.     } 
  11.     return pageData.getHtml();} 

這段代碼的結構與層次已經非常清晰,也對實現細節做了足夠合理的封裝與隱藏。若要說不足之處,或許可以將如下代碼再做一次方法提取,使其滿足SLAP原則(單一抽象層次原則):

  1. newPageContent.append(pageData.getContent()); 
  2.  
  3. //提取為: 
  4. includeTestContents(testPage, newPageContent) 

而Uncle Bob做的第二次重構,除了將方法變得更加短小,隱藏了太多細節從而引入更多層次之外,究竟給代碼的清晰帶來了什么呢?

  1. public static String renderPageWithSetupsAndTeardowns(PageData pageData, boolean isSuite) throws Exception { 
  2.     if (isTestPage(pageData)) 
  3.         includeSetupAndTeardownPages(pageData, isSuite); 
  4.     return pageData.getHtml(); 

過猶不及啊!

有時候,為了去除重復,就必須要從相似代碼中尋找到一種模式或者某種抽象,進而對其進行提取。過分的提取反而會讓代碼變得很難閱讀,這是因為提取的手段常常會引入“間接”。正如Martin Fowler所說:“間接性可能帶來幫助,但非必要的間接性總是讓人不舒服”。不必要的間接常常妨礙代碼的直截了當和干凈利落。倘若去除重復帶來的唯一好處僅僅是避免一個類中少許的私有重復,去除這樣的重復其實意義真的不大。

我喜歡清晰的代碼,但我認為保持代碼的正確、健壯與高效同樣重要。

因為代碼潔癖的緣故,我曾經將大量的非空判斷、非法檢查與異常處理視為干擾清晰代碼的洪水猛獸,但如果不做這些“臟活累活”,代碼就可能變得不健壯。在Java中,若真要避免這些判斷,可以考慮轉移職責,通過定義Checked Exception,將異常處理的職責轉移給方法的調用者。然而,職責的盲目轉移始終是不負責任的。實現每個方法和每個類的程序員應該保證自己的代碼是自治的。

如下代碼:

  1. @Override 
  2. public void run() { 
  3.    if (isFromFile) { 
  4.         if (hasQuery) { 
  5.             throw new RuntimeException("both --execute and --file specified"); 
  6.         } 
  7.         try { 
  8.             query = Files.toString(new File(clientOptions.file), UTF_8); 
  9.             hasQuery = true
  10.         } 
  11.         catch (IOException e) { 
  12.             throw new RuntimeException(format("Error reading from file %s: %s", clientOptions.file, e.getMessage())); 
  13.         } 
  14.     } 
  15. }     

這樣的代碼確實談不上優雅,然而足夠充分的判斷保證了代碼的正確性與健壯性。我只能說,在滿足了這兩點的前提下,可以聰明地利用諸如防御式編程、Optional來規避多余的嵌套或分支,從而提高代碼的可讀性。

Effective Java總結了高質量代碼的幾個特征:清晰、正確、可用、健壯、靈活和可維護。我認為這一總結非常中肯。寫代碼真的不要太偏執,不分任何場景一味地追求代碼的可讀(清晰),一味地重申DRY,我覺得都是不負責任的態度。

或許是我老了的緣故,我變得不再理想主義;但更多的原因是因為我看到太多追求所謂“整潔代碼”的程序,不愿考慮復雜繁瑣的異外情況從而導致程序的不健壯;因為去除重復帶來的不必要間接影響了代碼的簡潔與干凈,甚至影響了代碼運行的性能。

整潔代碼是必須的,但不是衡量代碼質量的唯一標準!

【本文為51CTO專欄作者“張逸”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2011-03-04 10:11:09

JavascriptAPI

2015-08-03 10:40:59

程序員代碼質量Quora

2015-08-25 08:29:11

編寫高質量命名

2011-12-29 15:02:27

JavaScript

2015-08-25 08:42:36

高質量代碼命名

2022-10-24 08:10:21

SQL代碼業務

2020-09-18 07:57:10

代碼編碼開發

2022-06-13 23:30:27

代碼詞匯高質量

2021-08-08 14:26:24

SQL數據庫開發

2011-05-31 13:43:46

外鏈

2015-07-13 10:48:44

OC代碼程序員

2023-10-31 16:22:31

代碼質量軟件開發Java

2010-03-01 14:31:04

Java

2012-09-13 10:44:18

Python代碼

2023-07-06 14:51:30

開發高質量軟件

2020-03-12 14:03:59

工具代碼開發

2011-04-01 09:13:19

VB程序員

2021-01-09 22:35:51

程序員編碼代碼

2024-03-07 11:39:24

HadolintDockerfile工具
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美操操操 | 免费a级毛片在线播放 | 中文字幕在线欧美 | 国产精品一区二区三区在线 | 国内久久精品 | 无人区国产成人久久三区 | 天天操夜夜操 | 亚洲综合在线视频 | 超碰操| 欧美国产精品一区二区三区 | 综合亚洲视频 | a级大片 | 国产精品免费在线 | 日韩在线中文字幕 | 综合久久99| 国产清纯白嫩初高生视频在线观看 | 国产在线观看不卡一区二区三区 | 日韩国产一区二区三区 | 91麻豆精品国产91久久久更新资源速度超快 | 在线观看视频91 | 欧美在线视频网站 | 免费a级毛片在线播放 | 欧美a√ | 免费观看毛片 | 99久久免费精品国产男女高不卡 | 国产精品日韩欧美一区二区三区 | 98久久| 精品91久久久 | 日韩午夜精品 | 三区四区在线观看 | 国产又色又爽又黄又免费 | 日本a v在线播放 | 国家一级黄色片 | 久久精品网 | 992tv人人草| 日本网站免费在线观看 | 免费视频一区二区三区在线观看 | 欧美精品一区二区三区四区五区 | 正在播放亚洲 | 伊人网一区 | 免费在线观看黄色av |