精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

寫讓別人能讀懂的優質代碼

移動開發
隨著軟件行業的不斷發展,歷史遺留的程序越來越多,代碼的維護成本越來越大,甚至大于開發成本。而新功能的開發又常常依賴于舊代碼,閱讀舊代碼所花費的時間幾乎要大于寫新功能的代碼。

[[150631]]

隨著軟件行業的不斷發展,歷史遺留的程序越來越多,代碼的維護成本越來越大,甚至大于開發成本。而新功能的開發又常常依賴于舊代碼,閱讀舊代碼所花費的時間幾乎要大于寫新功能的代碼。

我前幾天看了一本書,書中有這么一句話:

“復雜的代碼往往都是新手所寫,只有經驗老道的高手才能寫出簡單,富有表現力的代碼”

此話雖然說的有點夸張,可是也說明了經驗的重要性。

我們所寫的代碼除了讓機器執行外,還需要別人來閱讀。所以我們要寫:

  1. 讓別人能讀懂的代碼
  2. 可擴展的代碼
  3. 可測試的代碼(代碼應該具備可測試性,對沒有可測試性的代碼寫測試,是浪費生命的表現)

其中2,3點更多強調的是面向對象的設計原則。而本文則更多關注于局部的代碼問題,本文通過舉例的方式,總結平時常犯的錯誤和優化方式。

本文的例子基于兩個指導原則:

一.DRY(Don't repeat yourself)

此原則如此重要,簡單來說是因為:

  • 代碼越少,Bug也越少
  • 沒有重復邏輯的代碼更易于維護,當你修復了一個bug,如果相同的邏輯還出現在另外一個地方,而你沒意識到,你有沒有覺得自己很冤?

二.TED原則

  • 簡潔(Terse)
  • 具有表達力(Expressive)
  • 只做一件事(Do one thing)

三.舉例說明

1.拒絕注釋,用代碼來闡述注釋

反例:

 
  1. /// <summary> 
  2. /// !@#$%^&^&*((!@#$%^&^&*((!@#$%^&^&*((!@#$%^&^&*(( 
  3. /// </summary> 
  4. /// <returns></returns> 
  5.  public decimal GetCash() 
  6.  { 
  7.      //!@#$%^&^&*((!@#$%^&^&*(( 
  8.      var a = new List<decimal>() { 2m, 3m, 10m }; 
  9.      var b = 2
  10.      var c = 0m; 
  11.      //!@#$%^&^&*((!@#$%^&^&*((!@#$%^&^&*(( 
  12.      foreach (var p in a) 
  13.      { 
  14.          c += p*b; 
  15.      } 
  16.      return c; 
  17.  } 

重構后:

 
  1. public decimal CalculateTotalCash() 
  2.     var prices=new List<decimal>(){2m,3m,10m}; 
  3.     var itemCount = 2
  4.     return prices.Sum(p => p*itemCount); 

良好的代碼命名完全可以替代注釋的作用,如果你正在試圖寫一段注釋,從某種角度來看,你正在試圖寫一段別人無法理解的代碼。

當你無法為你的方法起一個準確的名稱時,很可能你的方法不止做了一件事,違反了(Do one thing)。特別是你想在方法名中加入:And,Or,If等詞時

2. 為布爾變量賦值

反例:

 
  1. public bool IsAdult(int age) 
  2.     bool isAdult; 
  3.     if (age > 18
  4.     { 
  5.         isAdult = true
  6.     } 
  7.     else 
  8.     { 
  9.         isAdult = false
  10.     } 
  11.     return isAdult; 

重構后:

  1. public bool IsAdult(int age) 
  2.     var isAdult = age > 18
  3.     return isAdult; 

3.雙重否定的條件判斷

反例:

  1. if (!isNotRemeberMe) 
  2.   
  3.  } 

重構后:

  1. if (isRemeberMe) 
  2.   

不管你有沒有見過這樣的條件,反正我見過。見到這樣的條件判斷,我頓時就暈了。

4.拒絕HardCode,拒絕挖坑

反例:

  1. if (carName == "Nissan"
  2.  { 
  3.   

重構后:

 
  1. if (car == Car.Nissan) 
  2.   
  3.  } 

既然咱們玩的是強類型語言,咱就用上編譯器的功能,讓錯誤發生在編譯階段

5.拒絕魔數,拒絕挖坑

反例:

 
  1. if (age > 18
  2.   

重構后:

 
  1. const int adultAge = 18
  2.  if (age > adultAge) 
  3.   

所謂魔數(Magic number)就是一個魔法數字,讀者完全弄不明白你這個數字是什么,這樣的代碼平時見的多了

6.復雜的條件判斷

反例:

 
  1. if (job.JobState == JobState.New 
  2.     || job.JobState == JobState.Submitted 
  3.     || job.JobState == JobState.Expired 
  4.     || job.JobTitle.IsNullOrWhiteSpace()) 
  5.     //.... 

重構后:

  1.     if (CanBeDeleted(job)) 
  2.     { 
  3.         // 
  4.     }        
  5.   
  6. private bool CanBeDeleted(Job job) 
  7.     var invalidJobState = job.JobState == JobState.New 
  8.                           || job.JobState == JobState.Submitted 
  9.                           || job.JobState == JobState.Expired; 
  10.     var invalidJob = string.IsNullOrEmpty(job.JobTitle); 
  11.   
  12.     return invalidJobState || invalidJob; 

有沒有豁然開朗的趕腳?

7.嵌套判斷

反例:

  1. var isValid = false
  2. if (!string.IsNullOrEmpty(user.UserName)) 
  3.     if (!string.IsNullOrEmpty(user.Password)) 
  4.     { 
  5.         if (!string.IsNullOrEmpty(user.Email)) 
  6.         { 
  7.             isValid = true
  8.         } 
  9.     } 
  10. return isValid; 

重構后:

  1. if (string.IsNullOrEmpty(user.UserName)) return false
  2. if (string.IsNullOrEmpty(user.Password)) return false
  3. if (string.IsNullOrEmpty(user.Email)) return false
  4.  return true

***種代碼是受到早期的某些思想:使用一個變量來存儲返回結果。事實證明,你一旦知道了結果就應該盡早返回。

8.使用前置條件

反例:

  1. if (!string.IsNullOrEmpty(userName)) 
  2.     if (!string.IsNullOrEmpty(password)) 
  3.     { 
  4.         //register 
  5.     } 
  6.     else 
  7.     { 
  8.         throw new ArgumentException("user password can not be empty"); 
  9.     } 
  10. else 
  11.     throw new ArgumentException("user name can not be empty"); 

重構后:

 
  1. if (string.IsNullOrEmpty(userName)) throw new ArgumentException("user name can not be empty"); 
  2. if (string.IsNullOrEmpty(password)) throw new ArgumentException("user password can not be empty"); 
  3. //register 

重構后的風格更接近契約編程,首先要滿足前置條件,否則免談。

9.參數過多,超過3個

反例:

  1. public void RegisterUser(string userName, string password, string email, string phone) 
  2.   

重構后:

 
  1. public void RegisterUser(User user) 
  2.   

過多的參數讓讀者難以抓住代碼的意圖,同時過多的參數將會影響方法的穩定性。另外也預示著參數應該聚合為一個Model

10.方法簽名中含有布爾參數

反例:

  1. public void RegisterUser(User user, bool sendEmail) 
  2.  { 
  3.   
  4.  } 

重構后:

  1. public void RegisterUser(User user) 
  2.   
  3.   
  4. public void SendEmail(User user) 
  5.   

布爾參數在告訴方法不止做一件事,違反了Do one thing

10.寫具有表達力的代碼

反例:

 
  1. private string CombineTechnicalBookNameOfAuthor(List<Book> books, string author) 
  2.     var filterBooks = new List<Book>(); 
  3.   
  4.     foreach (var book in books) 
  5.     { 
  6.         if (book.Category == BookCategory.Technical && book.Author == author) 
  7.         { 
  8.             filterBooks.Add(book); 
  9.         } 
  10.     } 
  11.     var name = ""
  12.     foreach (var book in filterBooks) 
  13.     { 
  14.         name += book.Name + "|"
  15.     } 
  16.     return name; 

重構后:

 
  1. private string CombineTechnicalBookNameOfAuthor(List<Book> books, string author) 
  2.  { 
  3.      var combinedName = books.Where(b => b.Category == BookCategory.Technical) 
  4.          .Where(b => b.Author == author) 
  5.          .Select(b => b.Name) 
  6.          .Aggregate((a, b) => a + "|" + b); 
  7.   
  8.      return combinedName; 
  9.  } 

相對于命令式代碼,聲明性代碼更加具有表達力,也更簡潔。這也是函數式編程為什么越來越火的原因之一。

四.關于DRY

平時大家重構代碼,一個重要的思想就是DRY。我要分享一個DRY的反例:

項目在架構過程中會有各種各樣的MODEL層,例如:DomainModel,ViewModel,DTO。很多時候這幾個Model里的字段大部分是相同的,于是有人就會想到DRY原則,干脆直接用一種類型,省得粘貼復制,來回轉換。

這個反例失敗的根本原因在于:這幾種Model職責各不相同,雖然大部分情況下內容會有重復,但是他們擔當著各種不同的角色。

考慮這種場景: DomainModel有一個字段DateTime Birthday{get;set;},ViewModel同樣具有DateTime Birthday{get;set;}。需求升級:要求界面不再顯示生日,只需要顯示是否成年。我們只需要在ViewModel中添加一個Bool IsAdult{get{return ....}}即可,DomainModel完全不用變化。

五.利用先進的生產工具

以vs插件中的Reshaper為例,本文列舉的大部分反例,Reshaprer均能給予不同程度的提示。經過一段時間的練習,當Reshaper對你的代碼給予不了任何提示的時候,你的代碼會有一個明顯的提高。

截圖說明Reshaper的提示功能:

光標移動在波浪線處,然后Alt+Enter,Resharper 會自動對代碼進行優化

如果你能夠避免本文總結的反例,你的代碼就已經具備了優秀代碼應有的基因。當然高質量的代碼還需要良好的設計和遵循面向對象編程的原則。 如果想了解更多相關內容,請閱讀《代碼大全》,《代碼整潔之道》,《重構 改善既有代碼的設計》,《敏捷軟件開發 原則、模式與實踐》

責任編輯:倪明 來源: 博客園
相關推薦

2015-09-28 09:05:27

別人能讀懂代碼

2015-09-28 10:49:59

代碼程序員

2018-10-20 15:20:10

2017-12-19 15:20:47

代碼應用架構

2019-02-22 09:31:06

IT網絡協議 IP

2022-07-26 14:38:08

JavaScriptWeb安全自動化

2020-03-30 16:45:06

代碼看不懂

2017-06-22 09:30:40

深度學習機器閱讀數據集

2020-05-21 16:10:58

程序員西游記網絡協議

2020-11-10 09:20:06

垃圾代碼優質代碼編輯語言

2025-08-18 07:33:58

2019-07-08 10:08:35

人工智能AI自動化

2009-06-08 10:42:24

2020-04-03 14:55:39

Python 代碼編程

2017-09-08 12:15:54

Python代碼Pythonic

2017-11-23 10:59:17

程序員代碼編程

2017-09-14 12:45:35

2021-03-28 16:55:11

Python工具鏈代碼

2017-03-02 13:05:10

Android代碼混淆

2023-01-04 07:33:34

機器代碼人工智能
點贊
收藏

51CTO技術棧公眾號

中文字幕一区视频| 日日天天久久| 亚洲精品免费视频| 国外成人在线视频网站| 国产99久久久| 久久国产亚洲精品| 精品免费国产一区二区三区四区| 啊啊啊一区二区| 免费人成在线观看播放视频| 成人天堂资源www在线| 日韩av三级在线观看| 国产成人免费在线观看视频| 懂色av一区二区| 在线免费观看一区| 久久久国内精品| 国产黄在线看| 成人国产在线观看| 国产原创欧美精品| 国产欧美日韩另类| 亚洲91久久| 亚洲免费高清视频| 性感美女一区二区三区| 免费一区二区三区四区| 欧美激情麻豆| 亚洲日本中文字幕| 日本美女视频网站| 久久天天久久| 色欧美88888久久久久久影院| 三级在线免费观看| 成人网视频在线观看| 成人av免费在线观看| 91免费看片网站| 亚洲婷婷久久综合| 国产欧美不卡| 欧美激情极品视频| 国产人妻精品一区二区三区不卡| 久久99视频| 亚洲电影免费观看高清完整版在线观看 | 黄色a在线观看| 极品美女销魂一区二区三区| 国产精品激情自拍| 亚洲欧美日韩一区二区三区四区| 一本色道久久| 午夜精品在线视频| 久久精品国产亚洲av麻豆色欲 | 你真棒插曲来救救我在线观看| 蜜芽在线免费观看| 国产精品久久久久久一区二区三区| 蜜桃传媒视频第一区入口在线看| 秋霞网一区二区| 成人av免费在线| 国产欧美韩日| 手机在线精品视频| 99久久er热在这里只有精品66| 国产精品国产三级国产专区53| av老司机久久| 国产成人一级电影| 99视频日韩| 精品人妻av一区二区三区| 国产 日韩 欧美大片| 91精品久久香蕉国产线看观看 | 日韩精品视频在线| 成人精品在线观看视频| 六月丁香久久丫| 日韩电影第一页| 瑟瑟视频在线观看| 日韩美女一区二区三区在线观看| 啊v视频在线一区二区三区| 男人的午夜天堂| 亚洲中无吗在线| 欧美疯狂性受xxxxx另类| 久久精品国产av一区二区三区| 一本综合久久| 国产精品成人国产乱一区| 欧美性受xxx黑人xyx性爽| 精品一区二区三区不卡| 亚洲最大成人在线| 色哟哟国产精品色哟哟| 久久精品视频免费| 亚洲一区二区三区乱码| 在线观看电影av| 欧美午夜电影在线| 在线观看国产一级片| 97超碰最新| 黄色小视频在线免费看| 国产日韩1区| 国产精品黄页免费高清在线观看| 国产一区二区三区四区视频| 国产成人综合精品三级| 精品一区二区三区国产| 成人福利在线| 亚洲最色的网站| 激情网站五月天| 欧美成人精品午夜一区二区| 国产偷国产偷亚洲清高网站| 97精品在线播放| 在线看片成人| 国产精品一区二区三区免费视频| 亚洲成人久久精品| 91美女在线观看| 国产精品成人观看视频免费| 欧美自拍第一页| 国产精品美女久久久久aⅴ| 很污的网站在线观看| 电影一区电影二区| 亚洲成人精品在线| 久草福利资源在线| 国产精品草草| 国产精品视频免费观看www| 亚洲精品喷潮一区二区三区| 亚洲国产成人私人影院tom| 日本男女交配视频| yy6080久久伦理一区二区| 亚洲国产成人91精品| 999精品视频在线观看播放| 国产农村妇女精品一区二区| 成人h在线播放| 免费观看成人高潮| 欧洲av在线精品| www.88av| 国产一区欧美| 91在线视频一区| 国产裸舞福利在线视频合集| 天天影视涩香欲综合网| 91精品国产高清91久久久久久| 第一sis亚洲原创| 欧美壮男野外gaytube| 老司机午夜福利视频| 亚洲色图欧美激情| 免费一级特黄录像| 国产欧美日韩一区二区三区四区 | 成人观看网址| 日韩精品一区二区三区三区免费 | 日韩亚洲视频在线观看| 亚洲综合丁香婷婷六月香| 亚洲精品成人在线播放| 日韩成人影院| 国产精品久久久久久av| 免费国产在线视频| 一本大道久久a久久综合| 亚洲国产精品无码久久久久高潮| 亚洲天堂激情| 国产精品成人一区二区三区| 免费在线观看av电影| 日韩一卡二卡三卡| 欧美人禽zoz0强交| 国产一区二区精品久久| 91成人在线视频观看| 在线视频成人| 久久成人在线视频| 国产aⅴ爽av久久久久成人| 亚洲免费av在线| 中文字幕avav| 亚洲视频久久| 狠狠色综合网站久久久久久久| zzzwww在线看片免费| 亚洲国产高清福利视频| 欧美亚洲精品天堂| 国产亚洲综合av| 天天爽夜夜爽一区二区三区| 97在线精品| 亚洲iv一区二区三区| 影音先锋在线视频| 亚洲精品国产电影| 91精品国产高清一区二区三密臀| 久久久青草青青国产亚洲免观| 国内外免费激情视频| 成人在线丰满少妇av| 国产精品综合久久久| 国产传媒在线播放| 亚洲成人久久一区| 在线观看污污网站| 国产精品国产三级国产普通话三级 | 小泽玛利亚一区| 国产成人免费视频网站| 久色视频在线播放| 成人在线丰满少妇av| 亚洲free性xxxx护士hd| 色综合桃花网| 深夜福利日韩在线看| 成人高潮片免费视频| 疯狂做受xxxx欧美肥白少妇 | 亚洲综合色噜噜狠狠| 亚洲中文字幕无码av| 日本伊人精品一区二区三区观看方式| 亚洲欧洲精品在线| 在线精品国产亚洲| 国产福利精品在线| 日韩影视在线| 正在播放欧美视频| 国内精品久久久久久久久久久| 污片在线观看一区二区| 欧日韩不卡视频| 成人夜色视频网站在线观看| 日本999视频| 国产一区二区三区自拍| 日韩欧美亚洲区| 日韩在线亚洲| 国产精品久久久久久久久免费| 欧美女同一区| 日韩在线免费观看视频| 4438x全国最大成人| 青青草免费在线| 欧美性色欧美a在线播放| 粉嫩av性色av蜜臀av网站| 91在线精品一区二区| 手机av在线免费| 香蕉视频成人在线观看| 国产一区二区三区播放| 欧美伦理影院| 精品产品国产在线不卡| 国产精品久久久久久久久久久久久久久| 欧美一级片免费在线| 男人在线资源站| 亚洲日韩中文字幕在线播放| xxxwww在线观看| 欧美三级一区二区| 美女又爽又黄免费视频| 亚洲国产乱码最新视频| 手机在线免费看毛片| 国产拍欧美日韩视频二区 | 久久综合五月天婷婷伊人| 亚洲五月激情网| 免费视频最近日韩| 国产l精品国产亚洲区久久| 欧美日韩一区二区国产| 成人手机视频在线| 精品国产一区二区三区久久久蜜臀| 国产精品视频一区二区三区经| 警花av一区二区三区| 国产在线高清精品| 成人一级视频| 国产精品7m视频| 日韩成人动漫| 青青草成人在线| 色吧亚洲日本| 91av在线免费观看视频| av在线网页| 久久久久久久久久久免费| 在线中文字幕视频观看| 另类视频在线观看| 精品176二区| 精品国产一区二区三区在线观看 | 天堂av手机版| 欧美精品一区二区三| 六月婷婷中文字幕| 亚洲成人黄色在线| 少妇高潮久久久| 亚洲国产成人精品久久| 三级视频在线看| 日韩电影中文字幕av| 亚洲欧美日韩综合在线| 亚洲精品久久久久久久久| 日韩一区二区三区不卡| 亚洲国产高清福利视频| 日韩福利一区二区| 亚洲图片欧美日产| 91社区在线观看播放| y97精品国产97久久久久久| 成人在线免费看片| 欧美美最猛性xxxxxx| 免费毛片在线看片免费丝瓜视频| 欧美另类xxx| 24小时免费看片在线观看| 26uuu亚洲伊人春色| 蜜臀国产一区| 国产日韩欧美综合| 麻豆久久一区| 精品欧美国产| 欧美精品系列| 亚洲国产欧美不卡在线观看 | 色综合综合网| 亚洲综合网中心| 国产精品xvideos88| 免费成人午夜视频| 日韩高清不卡一区二区三区| 天堂av2020| 99久久免费精品| 蜜桃无码一区二区三区| 亚洲欧洲av一区二区三区久久| 欧美成人三级视频| 狠狠躁夜夜躁人人躁婷婷91| 无码人妻丰满熟妇精品区| 欧美乱妇23p| 国产 日韩 欧美 精品| 亚洲香蕉伊综合在人在线视看| 日本在线观看视频| 久久人人爽人人爽人人片av高清| 黑人巨大精品欧美一区二区桃花岛| 国产精品揄拍500视频| 亚洲午夜精品| 日韩av一区二区三区在线观看| 中文无码久久精品| 欧美一级在线看| 国产尤物一区二区在线| 午夜一区二区三区免费| 亚洲丝袜美腿综合| 日本免费观看视| 555夜色666亚洲国产免| 日本不卡免费播放| 欧美成人精品在线播放| 日韩三区在线| 国产综合18久久久久久| 久久久国产精品| 青青草原av在线播放| 国产成人精品免费视频网站| 人人妻人人澡人人爽| 五月婷婷色综合| 国产精品一区二区黑人巨大| 亚洲精品视频网上网址在线观看 | 亚洲一区二区三区三| 欧美三级网站在线观看| 亚洲成人av片| 国产激情小视频在线| 国产精品电影一区| 精品视频高潮| 国产激情片在线观看| 蜜臀99久久精品久久久久久软件| 亚洲永久无码7777kkk| 亚洲国产欧美另类丝袜| 99久久精品免费看国产交换| 在线精品国产欧美| 波多野结衣亚洲| 精品国产电影| 亚洲茄子视频| 麻豆av免费看| 亚洲精品午夜久久久| 一级二级三级视频| 一区二区三区视频观看| 波多野结衣亚洲| 蜜桃导航-精品导航| 日韩一级大片| 日本天堂在线播放| 一区二区三区中文字幕| 国内精品偷拍视频| 美女性感视频久久久| 成人久久精品| 在线精品亚洲一区二区| 久久99精品久久只有精品| 在线观看免费小视频| 欧美性色黄大片手机版| 成人免费在线电影| 国产精品毛片a∨一区二区三区|国 | 成年人在线网站| 狠狠色综合欧美激情| 国产农村妇女精品一区二区| 右手影院亚洲欧美| 色av综合在线| 成年人视频网站在线| 国产精品欧美日韩一区二区| 日韩av在线中文字幕| 香港日本韩国三级网站| 国产精品久久福利| 国产精品亚洲欧美在线播放| 久久精品中文字幕电影| 激情不卡一区二区三区视频在线 | 免费中文字幕日韩欧美| 97超碰在线资源| 在线视频中文字幕一区二区| sese一区| 91丨九色丨国产在线| 欧美日韩国产探花| 丰满岳乱妇一区二区| 欧美日韩免费看| 番号集在线观看| 成人久久一区二区| 国产一在线精品一区在线观看| www.四虎精品| 色综合夜色一区| 国产最新视频在线| 成人免费淫片视频软件| 悠悠资源网久久精品| 37p粉嫩大胆色噜噜噜| 欧美视频一二三区| jizz性欧美10| 极品校花啪啪激情久久| 日韩av电影免费观看高清完整版| 国产极品美女在线| 亚洲成人黄色网| 999国产精品亚洲77777| 艳母动漫在线观看| 99久久精品免费看国产 | 日韩一区二区精品葵司在线| 91桃色在线| 亚洲欧美丝袜| 成人av免费在线| 中文人妻熟女乱又乱精品| 色综合久久久888| 国产精品美女久久久久久不卡| 亚洲av无日韩毛片久久| 天天综合色天天| 色综合久久久久综合一本到桃花网| 鬼打鬼之黄金道士1992林正英| 久久久久久黄| 欧美三级日本三级| 亚洲免费精彩视频| 午夜久久av| 亚洲欧美视频二区| 欧美日韩色婷婷| 中文在线免费|