色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是整潔的代碼

馬哥Linux運(yùn)維 ? 來(lái)源:馬哥Linux運(yùn)維 ? 2023-01-30 10:45 ? 次閱讀

寫(xiě)出整潔的代碼,是每個(gè)程序員的追求。《clean code》指出,要想寫(xiě)出好的代碼,首先得知道什么是骯臟代碼、什么是整潔代碼;然后通過(guò)大量的刻意練習(xí),才能真正寫(xiě)出整潔的代碼。

WTF/min是衡量代碼質(zhì)量的唯一標(biāo)準(zhǔn),Uncle Bob在書(shū)中稱糟糕的代碼為沼澤(wading),這只突出了我們是糟糕代碼的受害者。國(guó)內(nèi)有一個(gè)更適合的詞匯:屎山,雖然不是很文雅但是更加客觀,程序員既是受害者也是加害者。

對(duì)于什么是整潔的代碼,書(shū)中給出了大師們的總結(jié):

  • Bjarne Stroustrup:優(yōu)雅且高效;直截了當(dāng);減少依賴;只做好一件事
  • Grady booch:簡(jiǎn)單直接
  • Dave thomas:可讀,可維護(hù),單元測(cè)試
  • Ron Jeffries:不要重復(fù)、單一職責(zé),表達(dá)力(Expressiveness)

其中,我最喜歡的是表達(dá)力(Expressiveness)這個(gè)描述,這個(gè)詞似乎道出了好代碼的真諦:用簡(jiǎn)單直接的方式描繪出代碼的功能,不多也不少。

本文記錄閱讀《clean code》之后個(gè)人“深有同感”或者“醍醐灌頂”的一些觀點(diǎn)。

命名的藝術(shù)

坦白的說(shuō),命名是一件困難的事情,要想出一個(gè)恰到好處的命名需要一番功夫,尤其我們的母語(yǔ)還不是編程語(yǔ)言所通用的英語(yǔ)。不過(guò)這一切都是值得了,好的命名讓你的代碼更直觀,更有表達(dá)力。

好的命名應(yīng)該有下面的特征:

名副其實(shí)

好的變量名告訴你:是什么東西,為什么存在,該怎么使用

如果需要通過(guò)注釋來(lái)解釋變量,那么就先得不那么名副其實(shí)了。

下面是書(shū)中的一個(gè)示例代碼,展示了命名對(duì)代碼質(zhì)量的提升

#badcode
defgetItem(theList):
ret=[]
forxintheList:
ifx[0]==4:
ret.append(x)
returnret

#goodcode
defgetFlaggedCell(gameBoard):
'''掃雷游戲,flagged:翻轉(zhuǎn)'''
flaggedCells=[]
forcellingameBoard:
ifcell.IsFlagged():
flaggedCells.append(cell)
returnflaggedCells

避免誤導(dǎo)

  • 不要掛羊頭賣狗肉
  • 不要覆蓋慣用縮略語(yǔ) 這里不得不吐槽前兩天才看到的一份代碼,居然使用了 l 作為變量名;而且,user居然是一個(gè)list(單復(fù)數(shù)都沒(méi)學(xué)好!!)

有意義的區(qū)分

代碼是寫(xiě)給機(jī)器執(zhí)行,也是給人閱讀的,所以概念一定要有區(qū)分度。

#bad
defcopy(a_list,b_list):
pass

#good
defcopy(source,destination):
pass

使用讀的出來(lái)的單詞

如果名稱讀不出來(lái),那么討論的時(shí)候就會(huì)像個(gè)傻鳥(niǎo)

使用方便搜索的命名

名字長(zhǎng)短應(yīng)與其作用域大小相對(duì)應(yīng)

避免思維映射

比如在代碼中寫(xiě)一個(gè)temp,那么讀者就得每次看到這個(gè)單詞的時(shí)候翻譯成其真正的意義

注釋

有表達(dá)力的代碼是無(wú)需注釋的。

The proper use of comments is to compensate for our failure to express ourself in code.

注釋的適當(dāng)作用在于彌補(bǔ)我們用代碼表達(dá)意圖時(shí)遇到的失敗,這聽(tīng)起來(lái)讓人沮喪,但事實(shí)確實(shí)如此。The truth is in the code, 注釋只是二手信息,二者的不同步或者不等價(jià)是注釋的最大問(wèn)題。

書(shū)中給出了一個(gè)非常形象的例子來(lái)展示:用代碼來(lái)闡述,而非注釋

bad
//checktoseeiftheemployeeiseligibleforfullbenefit
if((employee.flags&HOURLY_FLAG)&&(employee.age>65))

good
if(employee.isEligibleForFullBenefits())

因此,當(dāng)想要添加注釋的時(shí)候,可以想想是否可以通過(guò)修改命名,或者修改函數(shù)(代碼)的抽象層級(jí)來(lái)展示代碼的意圖。

當(dāng)然,也不能因噎廢食,書(shū)中指出了以下一些情況屬于好的注釋

  1. 法務(wù)信息
  2. 對(duì)意圖的注釋,為什么要這么做
  3. 警示
  4. TODO注釋
  5. 放大看似不合理之物的重要性

其中個(gè)人最贊同的是第2點(diǎn)和第5點(diǎn),做什么很容易通過(guò)命名表達(dá),但為什么要這么做則并不直觀,特別涉及到專業(yè)知識(shí)、算法的時(shí)候。另外,有些第一感覺(jué)“不那么優(yōu)雅”的代碼,也許有其特殊愿意,那么這樣的代碼就應(yīng)該加上注釋,說(shuō)明為什么要這樣,比如為了提升關(guān)鍵路徑的性能,可能會(huì)犧牲部分代碼的可讀性。

最壞的注釋就是過(guò)時(shí)或者錯(cuò)誤的注釋,這對(duì)于代碼的維護(hù)者(也許就是幾個(gè)月后的自己)是巨大的傷害,可惜除了code review,并沒(méi)有簡(jiǎn)單易行的方法來(lái)保證代碼與注釋的同步。

函數(shù)

函數(shù)的單一職責(zé)

一個(gè)函數(shù)應(yīng)該只做一件事,這件事應(yīng)該能通過(guò)函數(shù)名就能清晰的展示。判斷方法很簡(jiǎn)單:看看函數(shù)是否還能再拆出一個(gè)函數(shù)。

函數(shù)要么做什么do_sth, 要么查詢什么query_sth。最惡心的就是函數(shù)名表示只會(huì)query_sth, 但事實(shí)上卻會(huì)do_sth, 這使得函數(shù)產(chǎn)生了副作用。比如書(shū)中的例子

publicclassUserValidator{
privateCryptographercryptographer;
publicbooleancheckPassword(StringuserName,Stringpassword){
Useruser=UserGateway.findByName(userName);
if(user!=User.NULL){
StringcodedPhrase=user.getPhraseEncodedByPassword();
Stringphrase=cryptographer.decrypt(codedPhrase,password);
if("ValidPassword".equals(phrase)){
Session.initialize();
returntrue;
}
}
returnfalse;
}
}

函數(shù)的抽象層級(jí)

每個(gè)函數(shù)一個(gè)抽象層次,函數(shù)中的語(yǔ)句都要在同一個(gè)抽象層級(jí),不同的抽象層級(jí)不能放在一起。比如我們想把大象放進(jìn)冰箱,應(yīng)該是這個(gè)樣子的:

defpushElephantIntoRefrige():
openRefrige()
pushElephant()
closeRefrige()

函數(shù)里面的三句代碼在同一個(gè)層級(jí)(高度)描述了要完成把大象放進(jìn)冰箱這件事順序相關(guān)的三個(gè)步驟。顯然,pushElephant這個(gè)步驟又可能包含很多子步驟,但是在pushElephantIntoRefrige這個(gè)層級(jí),是無(wú)需知道太多細(xì)節(jié)的。

當(dāng)我們想通過(guò)閱讀代碼的方式來(lái)了解一個(gè)新的項(xiàng)目時(shí),一般都是采取廣度優(yōu)先的策略,自上而下的閱讀代碼,先了解整體結(jié)構(gòu),然后再深入感興趣的細(xì)節(jié)。如果沒(méi)有對(duì)實(shí)現(xiàn)細(xì)節(jié)進(jìn)行良好的抽象(并凝練出一個(gè)名副其實(shí)的函數(shù)),那么閱讀者就容易迷失在細(xì)節(jié)的汪洋里。

某種程度看來(lái),這個(gè)跟金字塔原理也很像

每一個(gè)層級(jí)都是為了論證其上一層級(jí)的觀點(diǎn),同時(shí)也需要下一層級(jí)的支持;同一層級(jí)之間的多個(gè)論點(diǎn)又需要以某種邏輯關(guān)系排序。pushElephantIntoRefrige就是中心論點(diǎn),需要多個(gè)子步驟的支持,同時(shí)這些子步驟之間也有邏輯先后順序。

函數(shù)參數(shù)

函數(shù)的參數(shù)越多,組合出的輸入情況就愈多,需要的測(cè)試用例也就越多,也就越容易出問(wèn)題。

輸出參數(shù)相比返回值難以理解,這點(diǎn)深有同感,輸出參數(shù)實(shí)在是很不直觀。從函數(shù)調(diào)用者的角度,一眼就能看出返回值,而很難識(shí)別輸出參數(shù)。輸出參數(shù)通常逼迫調(diào)用者去檢查函數(shù)簽名,這個(gè)實(shí)在不友好。

向函數(shù)傳入Boolean(書(shū)中稱之為 Flag Argument)通常不是好主意。尤其是傳入True or False后的行為并不是一件事情的兩面,而是兩件不同的事情時(shí)。這很明顯違背了函數(shù)的單一職責(zé)約束,解決辦法很簡(jiǎn)單,那就是用兩個(gè)函數(shù)。

Dont repear yourself

在函數(shù)這個(gè)層級(jí),是最容易、最直觀實(shí)現(xiàn)復(fù)用的,很多IDE也難幫助我們講一段代碼重構(gòu)出一個(gè)函數(shù)。

不過(guò)在實(shí)踐中,也會(huì)出現(xiàn)這樣一種情況:一段代碼在多個(gè)方法中都有使用,但是又不完全一樣,如果抽象成一個(gè)通用函數(shù),那么就需要加參數(shù)、加if else區(qū)別。這樣就有點(diǎn)尷尬,貌似可以重構(gòu),但又不是很完美。

造成上述問(wèn)題的某種情況是因?yàn)椋@段代碼也違背了單一職責(zé)原則,做了不只一件事情,這才導(dǎo)致不好復(fù)用,解決辦法是進(jìn)行方法的細(xì)分,才能更好復(fù)用。也可以考慮template method來(lái)處理差異的部分。

測(cè)試

非常慚愧的是,在我經(jīng)歷的項(xiàng)目中,測(cè)試(尤其是單元測(cè)試)一直都沒(méi)有得到足夠的重視,也沒(méi)有試行過(guò)TDD。正因?yàn)槿笔В鸥辛己脺y(cè)試的珍貴。

我們常說(shuō),好的代碼需要有可讀性、可維護(hù)性、可擴(kuò)展性,好的代碼、架構(gòu)需要不停的重構(gòu)、迭代,但自動(dòng)化測(cè)試是保證這一切的基礎(chǔ),沒(méi)有高覆蓋率的、自動(dòng)化的單元測(cè)試、回歸測(cè)試,誰(shuí)都不敢去修改代碼,只能任其腐爛。

即使針對(duì)核心模塊寫(xiě)了單元測(cè)試,一般也很隨意,認(rèn)為這只是測(cè)試代碼,配不上生產(chǎn)代碼的地位,以為只要能跑通就行了。這就導(dǎo)致測(cè)試代碼的可讀性、可維護(hù)性非常差,然后導(dǎo)致測(cè)試代碼很難跟隨生產(chǎn)代碼一起更新、演化,最后導(dǎo)致測(cè)試代碼失效。所以說(shuō),臟測(cè)試 - 等同于 - 沒(méi)測(cè)試。

因此,測(cè)試代碼的三要素:可讀性,可讀性,可讀性。

對(duì)于測(cè)試的原則、準(zhǔn)則如下:

  • You are not allowed to write any production code unless it is to make a failing unit test pass. 沒(méi)有測(cè)試之前不要寫(xiě)任何功能代碼
  • You are not allowed to write any more of a unit test than is sufficient to fail; and compilation failures are failures. 只編寫(xiě)恰好能夠體現(xiàn)一個(gè)失敗情況的測(cè)試代碼
  • You are not allowed to write any more production code than is sufficient to pass the one failing unit test. 只編寫(xiě)恰好能通過(guò)測(cè)試的功能代碼

測(cè)試的FIRST準(zhǔn)則:

  1. 快速(Fast)測(cè)試應(yīng)該夠快,盡量自動(dòng)化。
  2. 獨(dú)立(Independent) 測(cè)試應(yīng)該應(yīng)該獨(dú)立。不要相互依賴
  3. 可重復(fù)(Repeatable) 測(cè)試應(yīng)該在任何環(huán)境上都能重復(fù)通過(guò)。
  4. 自我驗(yàn)證(Self-Validating) 測(cè)試應(yīng)該有bool輸出。不要通過(guò)查看日志這種低效率方式來(lái)判斷測(cè)試是否通過(guò)
  5. 及時(shí)(Timely) 測(cè)試應(yīng)該及時(shí)編寫(xiě),在其對(duì)應(yīng)的生產(chǎn)代碼之前編寫(xiě)


審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 自動(dòng)化
    +關(guān)注

    關(guān)注

    29

    文章

    5564

    瀏覽量

    79243
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4780

    瀏覽量

    68539

原文標(biāo)題:什么是整潔的代碼

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    循序漸進(jìn)搭建復(fù)雜B端系統(tǒng)整潔架構(gòu)

    時(shí)刻追趕潮流。在這樣一個(gè)時(shí)代背景下,軟件工程作為一門不起眼到有些枯燥的古老學(xué)科,似乎早已被開(kāi)發(fā)者們遺忘在角落。作為一名技術(shù)人員我們自然應(yīng)該時(shí)刻保持對(duì)前沿技術(shù)的追蹤,然而,當(dāng)發(fā)生線上問(wèn)題我們卻面對(duì)著成片的屎山代碼
    的頭像 發(fā)表于 11-18 17:11 ?1324次閱讀
    循序漸進(jìn)搭建復(fù)雜B端系統(tǒng)<b class='flag-5'>整潔</b>架構(gòu)

    Gmapping源代碼

    Gmapping源代碼.docx
    發(fā)表于 11-16 13:42 ?0次下載

    如何自動(dòng)生成verilog代碼

    介紹幾種自動(dòng)生成verilog代碼的方法。
    的頭像 發(fā)表于 11-05 11:45 ?287次閱讀
    如何自動(dòng)生成verilog<b class='flag-5'>代碼</b>

    MSP代碼保護(hù)功能

    電子發(fā)燒友網(wǎng)站提供《MSP代碼保護(hù)功能.pdf》資料免費(fèi)下載
    發(fā)表于 09-21 09:14 ?0次下載
    MSP<b class='flag-5'>代碼</b>保護(hù)功能

    代碼整潔之道-大師眼中的整潔代碼是什么樣

    模糊,帶著這個(gè)問(wèn)題,本人讀完了世界軟件開(kāi)發(fā)大師馬丁的《代碼整潔之道》這本書(shū),來(lái)了解下大師眼中的整潔代碼畫(huà)像是什么樣的,相信能給你帶來(lái)不一樣的理解和感悟。 關(guān)于
    的頭像 發(fā)表于 09-09 16:30 ?332次閱讀
    <b class='flag-5'>代碼</b><b class='flag-5'>整潔</b>之道-大師眼中的<b class='flag-5'>整潔</b><b class='flag-5'>代碼</b>是什么樣

    軟件設(shè)計(jì)哲學(xué):新“代碼整潔之道”

    工作三年以來(lái)一直對(duì)寫(xiě)出設(shè)計(jì)優(yōu)雅且可讀性較好的代碼抱有執(zhí)念,最初接觸到的關(guān)于代碼整潔和軟件設(shè)計(jì)的書(shū)是《代碼整潔之道》,這本書(shū)大概在我入職半年時(shí)
    的頭像 發(fā)表于 07-22 12:18 ?238次閱讀
    軟件設(shè)計(jì)哲學(xué):新“<b class='flag-5'>代碼</b><b class='flag-5'>整潔</b>之道”

    國(guó)內(nèi)低代碼平臺(tái)推薦--萬(wàn)界星空科技低代碼平臺(tái)

    代碼平臺(tái)是一種應(yīng)用程序,它為編程提供圖形用戶界面,從而以極快的速度開(kāi)發(fā)代碼,減少傳統(tǒng)編程工作。 這些工具有助于快速開(kāi)發(fā)代碼,最大限度地減少手工編碼的工作量。這些平臺(tái)不僅有助于編碼,還有助于快速設(shè)置和部署。
    的頭像 發(fā)表于 07-18 15:39 ?293次閱讀
    國(guó)內(nèi)低<b class='flag-5'>代碼</b>平臺(tái)推薦--萬(wàn)界星空科技低<b class='flag-5'>代碼</b>平臺(tái)

    該如何提高代碼容錯(cuò)率、降低代碼耦合度?

    提高RT-Thread代碼的容錯(cuò)率和降低耦合度是確保代碼質(zhì)量和可維護(hù)性的關(guān)鍵,下面列舉了幾種在編寫(xiě)代碼時(shí),提高代碼容錯(cuò)率和降低耦合度的思路。讓我們一起來(lái)看看吧~一、提高
    的頭像 發(fā)表于 06-26 08:10 ?659次閱讀
    該如何提高<b class='flag-5'>代碼</b>容錯(cuò)率、降低<b class='flag-5'>代碼</b>耦合度?

    手柄控制代碼及使用方法

    手柄控制代碼及使用方法
    的頭像 發(fā)表于 05-15 10:19 ?1772次閱讀

    藍(lán)牙遙控代碼及使用

    藍(lán)牙遙控代碼及使用
    的頭像 發(fā)表于 05-15 10:15 ?819次閱讀

    如何提升代碼質(zhì)量與效率的秘訣

    提高編程能力其實(shí)沒(méi)有捷徑,最佳方式就是多寫(xiě)代碼。 不過(guò),除了寫(xiě)大量代碼,提升編程能力還需要大量閱讀別人寫(xiě)的代碼
    的頭像 發(fā)表于 04-28 14:53 ?392次閱讀
    如何提升<b class='flag-5'>代碼</b>質(zhì)量與效率的秘訣

    g代碼和m代碼表示什么功能

    G代碼和M代碼是數(shù)控機(jī)床程序中常用的兩種指令代碼,用于控制數(shù)控機(jī)床的工作動(dòng)作和運(yùn)動(dòng)方式。 G代碼是指控制機(jī)床工作動(dòng)作的指令代碼,它是一種簡(jiǎn)單
    的頭像 發(fā)表于 02-14 15:49 ?4291次閱讀

    ABB變頻器故障代碼

    ? ? ? ABB變頻器是非常普遍的工業(yè)設(shè)備。在許多行業(yè)中應(yīng)用廣泛。然而,無(wú)論是由于使用年限或其他因素,ABB變頻器故障或出現(xiàn)錯(cuò)誤的可能性是存在的。本文將為您介紹ABB變頻器故障代碼表并提供詳實(shí)
    的頭像 發(fā)表于 02-02 17:10 ?4458次閱讀
    ABB變頻器故障<b class='flag-5'>代碼</b>表

    淺談代碼優(yōu)化與過(guò)度設(shè)計(jì)

    本文記錄了作者從“代碼優(yōu)化”到“過(guò)度設(shè)計(jì)”的典型思考過(guò)程,這過(guò)程中涉及了很多Java的語(yǔ)法糖及設(shè)計(jì)模式的東西,很典型,能啟發(fā)思考,遂記錄下來(lái)。 有一天Review師妹的代碼,看到一行很難看的代碼
    的頭像 發(fā)表于 01-19 10:05 ?545次閱讀
    淺談<b class='flag-5'>代碼</b>優(yōu)化與過(guò)度設(shè)計(jì)

    BQ3568_代碼下載

    BQ3568_代碼下載
    的頭像 發(fā)表于 01-11 11:34 ?610次閱讀
    主站蜘蛛池模板: 亚洲精品一卡二卡三卡四卡2021| 麻豆一二三区果冻| 伊人久久综合热青草| 久久久久九九| 97无码欧美熟妇人妻蜜桃天美| 女教师跟黑人男朋友激情过后| 变态露出野外调教| 天天综合亚洲综合网站| 国内卡一卡二卡三免费网站| 伊人精品视频直播| 嫩B人妻精品一区二区三区| 插我一区二区在线观看| 无码人妻精品一区二区蜜桃色| 换脸国产AV一区二区三区| 中俄两军在日本海等上空战略巡航| 免费在线观看a视频| 成视频高清| 亚洲国产精品久久无套麻豆| 久久精品影视| 99视频免费看| 网友自拍成人在线视频| 狠狠色色综合网站| 99久久99久久精品| 少妇仑乱A毛片| 精品熟女少妇AV久久免费A片| 中文字幕人成人乱码亚洲AV| 欧美日韩亚洲成人| 国产精品一区二区人妻无码| 伊人久久综合成人亚洲| 青青热久精品国产亚洲AV无码| 国产露脸无码A区久久| 真实处破女全过程完免费观看| 欧美最猛12teevideos| 国产日韩欧美三级| 18禁无遮遮挡羞漫画免费阅读| 日韩亚洲国产中文字幕欧美| 精彩国产萝视频在线| 黑人特黄AA完整性大片| 沟沟人体一区二区| 131美女爱做视频午夜剧场| 在线看免费毛片|