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

寫讓別人能讀懂的代碼

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

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

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

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

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

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

  1. 讓別人能讀懂的代碼

  2. 可擴展的代碼

  3. 可測試的代碼(代碼應該具備可測試性,對沒有可測試性的代碼寫測試,是浪費生命的表現)

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

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

一.DRY(Don't repeat yourself)

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

  • 代碼越少,Bug也越少

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

二.TED原則

  • 簡潔(Terse)

  • 具有表達力(Expressive)

  • 只做一件事(Do one thing)

三.舉例說明

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

反例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/// <summary>

/// !@#$%^&^&*((!@#$%^&^&*((!@#$%^&^&*((!@#$%^&^&*((

/// </summary>

/// <returns></returns>

 public decimal GetCash()

 {

     //!@#$%^&^&*((!@#$%^&^&*((

     var a = new List<decimal>() { 2m, 3m, 10m };

     var b = 2;

     var c = 0m;

     //!@#$%^&^&*((!@#$%^&^&*((!@#$%^&^&*((

     foreach (var p in a)

     {

         c += p*b;

     }

     return c;

 }

重構后:

1

2

3

4

5

6

public decimal CalculateTotalCash()

{

    var prices=new List<decimal>(){2m,3m,10m};

    var itemCount = 2;

    return prices.Sum(p => p*itemCount);

}

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

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

2. 為布爾變量賦值

反例:

1

2

3

4

5

6

7

8

9

10

11

12

13

public bool IsAdult(int age)

{

    bool isAdult;

    if (age > 18)

    {

        isAdult = true;

    }

    else

    {

        isAdult = false;

    }

    return isAdult;

}

重構后:

1

2

3

4

5

public bool IsAdult(int age)

{

    var isAdult = age > 18;

    return isAdult;

}

3.雙重否定的條件判斷

反例:

1

2

3

4

if (!isNotRemeberMe)

{

 

 }

重構后:

1

2

3

4

if (isRemeberMe)

{

 

}

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

4.拒絕HardCode,拒絕挖坑

反例:

1

2

3

4

if (carName == "Nissan")

 {

 

}

重構后:

1

2

3

4

if (car == Car.Nissan)

{

 

 }

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

5.拒絕魔數,拒絕挖坑

反例:

1

2

3

4

if (age > 18)

{

 

}

重構后:

1

2

3

4

5

const int adultAge = 18;

 if (age > adultAge)

{

 

}

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

6.復雜的條件判斷

反例:

1

2

3

4

5

6

7

if (job.JobState == JobState.New

    || job.JobState == JobState.Submitted

    || job.JobState == JobState.Expired

    || job.JobTitle.IsNullOrWhiteSpace())

{

    //....

}

重構后:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

    if (CanBeDeleted(job))

    {

        //

    }       

 

private bool CanBeDeleted(Job job)

{

    var invalidJobState = job.JobState == JobState.New

                          || job.JobState == JobState.Submitted

                          || job.JobState == JobState.Expired;

    var invalidJob = string.IsNullOrEmpty(job.JobTitle);

 

    return invalidJobState || invalidJob;

}

有沒有豁然開朗的趕腳?

7.嵌套判斷

反例:

1

2

3

4

5

6

7

8

9

10

11

12

var isValid = false;

if (!string.IsNullOrEmpty(user.UserName))

{

    if (!string.IsNullOrEmpty(user.Password))

    {

        if (!string.IsNullOrEmpty(user.Email))

        {

            isValid = true;

        }

    }

}

return isValid;

重構后:

1

2

3

4

if (string.IsNullOrEmpty(user.UserName)) return false;

if (string.IsNullOrEmpty(user.Password)) return false;

if (string.IsNullOrEmpty(user.Email)) return false;

 return true;

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

8.使用前置條件

反例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

if (!string.IsNullOrEmpty(userName))

{

    if (!string.IsNullOrEmpty(password))

    {

        //register

    }

    else

    {

        throw new ArgumentException("user password can not be empty");

    }

}

else

{

    throw new ArgumentException("user name can not be empty");

}

重構后:

1

2

3

if (string.IsNullOrEmpty(userName)) throw new ArgumentException("user name can not be empty");

if (string.IsNullOrEmpty(password)) throw new ArgumentException("user password can not be empty");

//register

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

9.參數過多,超過3個

反例:

1

2

3

4

public void RegisterUser(string userName, string password, string email, string phone)

{

 

}

重構后:

1

2

3

4

public void RegisterUser(User user)

{

 

}

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

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

反例:

1

2

3

4

public void RegisterUser(User user, bool sendEmail)

 {

 

 }

重構后:

1

2

3

4

5

6

7

8

9

public void RegisterUser(User user)

{

 

}

 

public void SendEmail(User user)

{

 

}

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

10.寫具有表達力的代碼

反例:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

private string CombineTechnicalBookNameOfAuthor(List<Book> books, string author)

{

    var filterBooks = new List<Book>();

 

    foreach (var book in books)

    {

        if (book.Category == BookCategory.Technical && book.Author == author)

        {

            filterBooks.Add(book);

        }

    }

    var name = "";

    foreach (var book in filterBooks)

    {

        name += book.Name + "|";

    }

    return name;

}

重構后:

1

2

3

4

5

6

7

8

9

private string CombineTechnicalBookNameOfAuthor(List<Book> books, string author)

 {

     var combinedName = books.Where(b => b.Category == BookCategory.Technical)

         .Where(b => b.Author == author)

         .Select(b => b.Name)

         .Aggregate((a, b) => a + "|" + b);

 

     return combinedName;

 }

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

四.關于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:17:43

代碼可閱讀代碼質量

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安全自動化

2017-06-22 09:30:40

深度學習機器閱讀數據集

2020-03-30 16:45:06

代碼看不懂

2020-05-21 16:10:58

程序員西游記網絡協議

2025-08-18 07:33:58

2019-07-08 10:08:35

人工智能AI自動化

2020-04-03 14:55:39

Python 代碼編程

2017-09-08 12:15:54

Python代碼Pythonic

2017-11-23 10:59:17

程序員代碼編程

2017-03-02 13:05:10

Android代碼混淆

2021-03-28 16:55:11

Python工具鏈代碼

2023-01-04 07:33:34

機器代碼人工智能

2013-04-18 10:54:48

大數據APP大數據全球技術峰會

2020-03-20 10:40:44

代碼開發工具

2017-02-27 17:34:12

大數據
點贊
收藏

51CTO技術棧公眾號

精品国产一区二区三区香蕉沈先生 | 国产欧美91| 日韩电影中文字幕在线| 欧美午夜性生活| av网站大全在线| 91在线观看地址| 国产精品一区二区久久精品| 久久国产精品二区| 国产伦精品一区二区三区视频 | 日韩精品欧美激情一区二区| 欧美大片免费久久精品三p| a√天堂在线观看| 免费黄色网页在线观看| 99久久久免费精品国产一区二区 | 欧美一级免费播放| 亚洲图片88| 99精品国产视频| 91久久精品国产91性色| av黄色在线播放| 国产精品成人一区二区网站软件| 亚洲视频视频在线| 动漫美女无遮挡免费| 久久亚洲国产精品尤物| 天天操天天色综合| 欧美美女黄色网| freemovies性欧美| 99国产一区二区三精品乱码| 成人在线免费观看视视频| 亚洲天堂一区在线观看| 一区二区三区午夜探花| 国产一区二区三区毛片| 国产麻豆xxxvideo实拍| 亚洲综合网狠久久| 欧美美女一区二区在线观看| 91黄色小网站| 国产污视频在线播放| 一区二区高清免费观看影视大全| 一本久道久久综合狠狠爱亚洲精品| 亚洲精品乱码久久久久久蜜桃图片| 欧美在线va视频| 福利微拍一区二区| 极品粉嫩国产18尤物| 欧美videosex性极品hd| 亚洲日本韩国一区| 一区二区三区四区五区精品 | 激情深爱综合网| 欧美xxxx黑人又粗又长| 亚洲精品视频在线观看免费| 亚洲一区二区四区| 在线观看免费高清完整| 国产丝袜美腿一区二区三区| 欧美日韩免费精品| 国产在线一二三区| 久久久精品蜜桃| 欧美在线播放一区| 国产黄色片在线播放| 久久精品一区二区| 日韩欧美在线一区二区| av影片在线看| 欧美国产一区视频在线观看| 亚洲国产精品日韩| 成人影院在线看| 亚洲婷婷综合色高清在线| 在线视频一区观看| www香蕉视频| 国产成人免费视频网站| 国产久一道中文一区| 蜜臀av中文字幕| 93久久精品日日躁夜夜躁欧美| 国产九色91| 国产在线一二三| 国产精品九色蝌蚪自拍| 欧美性受黑人性爽| hd国产人妖ts另类视频| 日韩欧美在线观看视频| 熟女人妇 成熟妇女系列视频| 日本美女久久| 制服丝袜国产精品| 四虎成人免费视频| 精品一区亚洲| 久久精品人人做人人爽| 久久精品免费av| 三级不卡在线观看| 欧美精品videos性欧美| 国产性xxxx高清| 日韩国产在线观看一区| 91九色视频在线| 性xxxxbbbb| 国产人成亚洲第一网站在线播放| 亚洲一区尤物| 成人免费高清观看| 一本大道综合伊人精品热热| 日韩va在线观看| 女同一区二区三区| 深夜福利国产精品| 日韩熟女精品一区二区三区| 日本视频中文字幕一区二区三区| 5g影院天天爽成人免费下载| 午夜一区在线观看| 自拍偷自拍亚洲精品播放| 777av视频| 激情小说亚洲| 日韩国产精品一区| 日本在线一级片| 久久一区视频| 国产成人精品免费视频大全最热| 黄色av网站在线| 亚洲一区在线观看免费观看电影高清 | 日本综合在线| 欧美视频在线视频| 无码人妻一区二区三区免费n鬼沢| 亚洲天堂日韩在线| 久久久久久久999| 91国产免费视频| www久久久久| 国产乱人伦精品一区二区三区| 韩国精品主播一区二区在线观看 | 欧美日韩国产色视频| 91精品视频国产| 国产日韩视频在线| 97在线视频精品| 亚洲av无码一区二区乱子伦 | 日本在线视频免费观看| 精品伊人久久久久7777人| 蜜桃av噜噜一区二区三| 久草在线视频资源| 欧美一区二区三区在线观看| www.日本高清视频| 久久久久在线| 久久99影院| 91吃瓜在线观看| 欧美一区二区在线观看| 亚洲女人毛茸茸高潮| 日韩电影在线观看一区| 免费国产一区| 亚洲一区站长工具| 日韩黄色在线免费观看| 99精品视频99| 不卡的看片网站| 丝袜人妻一区二区三区| youjizzjizz亚洲| 久久91精品国产91久久久| 国产精品呻吟久久| 自拍偷自拍亚洲精品播放| 欧洲在线免费视频| 91欧美国产| 成人a视频在线观看| 97超碰人人在线| 欧美日韩精品福利| 波多野结衣家庭教师在线观看| 日本欧美一区二区三区| 亚洲精品高清国产一线久久| 69堂免费精品视频在线播放| 国产亚洲精品久久久| 精品一区二区无码| 久久99深爱久久99精品| 亚洲国产激情一区二区三区| 国产香蕉久久| 久久国产精品偷| 亚洲成人黄色片| 欧美日韩久久久久| 美女脱光内衣内裤| 蜜桃91丨九色丨蝌蚪91桃色| 亚洲免费不卡| 欧美第一在线视频| 亚洲 日韩 国产第一| 免费动漫网站在线观看| 欧美视频你懂的| 精品黑人一区二区三区久久| 黄色永久免费网站| 亚洲mv大片欧洲mv大片| 99蜜桃在线观看免费视频网站| 亚洲男同gay网站| 亚洲国产黄色片| 国产女主播喷水视频在线观看| 欧美国产精品一区二区| 三级黄色片免费观看| 极品裸体白嫩激情啪啪国产精品| 久久亚洲综合网| 黄色日韩网站| 久久久久久免费精品| 国产一区电影| 日韩一级高清毛片| 国产午夜免费福利| 中文字幕一区二区三区精华液 | 久久久久九九视频| 欧美一级xxxx| 日韩一级免费| 亚洲欧美日韩精品久久久| 日本免费精品| 国产成人精品在线播放| 成人综合视频在线| 日韩欧美精品综合| 国产福利久久| 国产黄色一区| 国内精品一区二区三区| 午夜免费视频在线国产| 欧美v亚洲v综合ⅴ国产v| 91视频在线视频| 洋洋成人永久网站入口| 非洲一级黄色片| 国产精品亚洲人在线观看| 99免费视频观看| 欧美先锋影音| 亚洲欧洲精品在线观看| 全国精品免费看| 91亚洲精品久久久久久久久久久久| 牛牛精品一区二区| 美日韩在线视频| 欧美被日视频| 亚洲图片欧洲图片av| 亚洲精品久久久久久无码色欲四季 | 香蕉久久精品| 91免费看蜜桃| 久久伊人国产| 日韩免费中文字幕| h片在线观看下载| 超碰97人人做人人爱少妇| 九九热视频在线观看| 亚洲成成品网站| 国产日韩欧美中文字幕| 欧美日韩亚洲综合一区二区三区| 99热国产在线观看| 午夜伦欧美伦电影理论片| 国产精品免费人成网站酒店| 欧美极品xxx| 波多野在线播放| 91首页免费视频| 91精品国产高清91久久久久久| 精品一区二区在线免费观看| 久久久精品麻豆| 天使萌一区二区三区免费观看| 2018日日夜夜| 狠狠爱www人成狠狠爱综合网| 91麻豆天美传媒在线| 首页国产精品| 亚洲成人蜜桃| 狠狠色丁香婷婷综合影院| 久久免费99精品久久久久久| 欧美美女在线直播| 久久av免费观看| 群体交乱之放荡娇妻一区二区| 国产成人精品一区二区三区福利| 精品国产鲁一鲁****| 亚洲自拍欧美另类| 亚洲国产视频二区| 99精品在线直播| 国产成人在线中文字幕| 国产精品一 二 三| 欧洲精品一区| 日韩.欧美.亚洲| 国产精品二区不卡| 亚洲激情免费视频| 亚洲区第一页| 国产精品视频一区二区三区四区五区| 一区二区国产精品| 久久综合久久色| 久久丁香综合五月国产三级网站| 99热手机在线| 国内精品免费**视频| 宇都宫紫苑在线播放| 成人激情动漫在线观看| 中国av免费看| 日本一区二区三区在线观看| 99精品欧美一区二区| 国产精品美女久久福利网站 | 亚洲成av人影院在线观看网| 日韩欧美视频在线免费观看| 色综合天天性综合| 亚洲熟女乱色一区二区三区久久久| 欧美男同性恋视频网站| 性猛交富婆╳xxx乱大交天津| 精品99999| 国模吧精品人体gogo| 日韩视频在线一区| 2019男人天堂| 欧美日韩亚洲在线观看| 亚洲最大免费| 亚洲婷婷免费| 欧美激情精品久久久久久小说| 韩国精品久久久| 熟妇人妻久久中文字幕| 国产欧美日韩精品在线| 丝袜美腿小色网| 狠狠综合久久av一区二区小说 | 欧美日韩高清影院| 好男人在线视频www| 亚洲人成在线一二| 超碰在线无需免费| 2019中文在线观看| 伊人久久一区| 久久99久久精品国产| 婷婷综合激情| 久久美女福利视频| 国产精品亚洲视频| 日韩av片在线| 亚洲国产另类精品专区| 中文字幕av无码一区二区三区| 欧美一三区三区四区免费在线看| 日韩精品一二| 欧美精品午夜视频| a屁视频一区二区三区四区| 高清视频一区二区三区| 日韩久久久久| 男人靠女人免费视频网站| 国产一区二区三区观看| 无码一区二区三区在线| 亚洲成人免费观看| 国产精品久久久久久无人区| 亚洲剧情一区二区| 欧美videosex性极品hd| 91精品视频在线播放| 国产欧美日韩精品一区二区三区| 国产玉足脚交久久欧美| 国内精品视频一区二区三区八戒| 99久久久无码国产精品性| 亚洲国产精品一区二区久久| 91在线视频国产| 一本色道久久综合亚洲精品小说 | 亚洲精品国产一区黑色丝袜| 亚洲一区日韩精品中文字幕| 国产精品色综合| 综合网中文字幕| 第84页国产精品| 精品国产一区二区三区免费| 欧美精品国产一区二区| 天天色天天综合网| 国产精品女同一区二区三区| 无码无套少妇毛多18pxxxx| 亚洲黄页网在线观看| 国产精品久久久久久久成人午夜| 亚洲区一区二区| 性国裸体高清亚洲| 精品免费一区二区三区蜜桃| 伊人久久大香线蕉综合热线 | 欧美美最猛性xxxxxx| 亚洲精品一区av| 在线视频亚洲自拍| 久久99久久精品| 正在播放国产对白害羞| 欧美影院午夜播放| 国产乱子伦三级在线播放| 日韩暖暖在线视频| 欧美猛男同性videos| 成年网站在线免费观看| 久久精品一二三| 亚洲成人av网址| 中文字幕日韩欧美| 国产精品蜜月aⅴ在线| 亚洲一区在线直播| 国产一区二区网址| 清纯粉嫩极品夜夜嗨av| 欧美成人vr18sexvr| av老司机免费在线| 久久精品一二三区| 视频在线观看一区二区三区| 精品国产aaa| 欧美乱妇一区二区三区不卡视频| av在线电影播放| 91久久久久久久久久久| 黄色精品免费| 无套白嫩进入乌克兰美女| 亚洲图片欧美一区| 日本韩国精品一区二区| 国产精品久久网| 你懂的网址国产 欧美| 男人的天堂影院| 色婷婷综合五月| 色影视在线观看| 9a蜜桃久久久久久免费| 日韩一级大片| 成年人免费视频播放| 日韩欧美国产系列| 中文字幕资源网在线观看免费 | 久久精品人成| 捆绑调教一区二区三区| 91视频综合网| 亚洲国产日韩欧美在线图片| 三上悠亚激情av一区二区三区| 亚洲一区精彩视频| www.欧美精品一二区| 国产无遮挡又黄又爽又色视频| 久久精品一区中文字幕| 精品国产影院| 女同激情久久av久久| 亚洲成a人v欧美综合天堂下载 | 欧美久久精品一级黑人c片 | 久久av影院| 精品丰满人妻无套内射| 国产精品入口麻豆原神| 成人毛片在线免费观看| 国产精品h片在线播放| 欧美freesex交免费视频| 人妻少妇一区二区| 日韩一区二区免费在线电影| 厕沟全景美女厕沟精品| 亚洲色婷婷久久精品av蜜桃| 久久久国产一区二区三区四区小说| 国产乱码久久久久| 人人做人人澡人人爽欧美|