国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

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

什么是整潔的代碼

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-01-30 10:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

命名的藝術(shù)

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

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

名副其實

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

如果需要通過注釋來解釋變量,那么就先得不那么名副其實了。

下面是書中的一個示例代碼,展示了命名對代碼質(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)

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

有意義的區(qū)分

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

#bad
defcopy(a_list,b_list):
pass

#good
defcopy(source,destination):
pass

使用讀的出來的單詞

如果名稱讀不出來,那么討論的時候就會像個傻鳥

使用方便搜索的命名

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

避免思維映射

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

注釋

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

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

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

書中給出了一個非常形象的例子來展示:用代碼來闡述,而非注釋

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

good
if(employee.isEligibleForFullBenefits())

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

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

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

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

最壞的注釋就是過時或者錯誤的注釋,這對于代碼的維護(hù)者(也許就是幾個月后的自己)是巨大的傷害,可惜除了code review,并沒有簡單易行的方法來保證代碼與注釋的同步。

函數(shù)

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

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

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

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ù)的抽象層級

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

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

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

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

某種程度看來,這個跟金字塔原理也很像

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

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

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

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

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

Dont repear yourself

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

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

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

測試

非常慚愧的是,在我經(jīng)歷的項目中,測試(尤其是單元測試)一直都沒有得到足夠的重視,也沒有試行過TDD。正因為缺失,才更感良好測試的珍貴。

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

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

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

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

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

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

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


審核編輯 :李倩


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

    關(guān)注

    31

    文章

    5933

    瀏覽量

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

    關(guān)注

    30

    文章

    4968

    瀏覽量

    73970

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    AI代碼之爭忽略了什么

    人工智能的興起讓 COBOL 重新成為話題焦點,市場上也涌現(xiàn)出不少號稱能轉(zhuǎn)換遺留代碼、破解現(xiàn)代化難題的工具。但關(guān)鍵在于厘清這究竟意味著什么,以及它不包含什么。代碼轉(zhuǎn)換是一回事,平臺現(xiàn)代化則完全是另一碼事。這兩者并非同一概念,而橫亙其間的鴻溝,恰恰是大多數(shù)企業(yè)遇到麻煩的地方
    的頭像 發(fā)表于 03-02 15:20 ?312次閱讀

    電力調(diào)整器常見故障代碼

    電力調(diào)整器(又稱晶閘管調(diào)功器)的故障代碼因品牌和型號而異,沒有一個完全統(tǒng)一的標(biāo)準(zhǔn),但核心的保護(hù)功能是相似的。下表為你整理了合泉TM三相系列不同編碼系統(tǒng)中常見的故障代碼及其含義。
    的頭像 發(fā)表于 12-16 09:41 ?457次閱讀
    電力調(diào)整器常見故障<b class='flag-5'>代碼</b>

    HarmonyOS應(yīng)用代碼混淆技術(shù)方案

    代碼混淆技術(shù)可以增加代碼的復(fù)雜性和模糊性,從而提高攻擊者分析代碼的難度。
    的頭像 發(fā)表于 11-21 16:17 ?5605次閱讀
    HarmonyOS應(yīng)用<b class='flag-5'>代碼</b>混淆技術(shù)方案

    TE Connectivity推出全新雙槽SIAMEZE端子

    在閥門產(chǎn)品迭代中,電磁閥正面臨空間極限與布線整潔的雙重挑戰(zhàn)。
    的頭像 發(fā)表于 11-17 16:14 ?952次閱讀

    一段ESP32S2代碼

    代碼
    的頭像 發(fā)表于 11-11 07:25 ?374次閱讀

    代碼開發(fā)平臺推薦:2025國內(nèi)低代碼開發(fā)平臺排名TOP10

    代碼開發(fā)平臺排行榜 在企業(yè)數(shù)字化轉(zhuǎn)型的浪潮中,低代碼開發(fā)平臺正逐漸成為企業(yè)實現(xiàn)高效開發(fā)和快速迭代的重要工具。隨著技術(shù)的不斷進(jìn)步和市場需求的持續(xù)增長,低代碼開發(fā)平臺的市場競爭也日益激烈。以下
    的頭像 發(fā)表于 10-28 10:22 ?735次閱讀

    2025主流低代碼平臺有哪些:低代碼開發(fā)平臺選型指南指南

    在企業(yè)數(shù)字化轉(zhuǎn)型進(jìn)入深水區(qū)的當(dāng)下,低代碼開發(fā)平臺已從早期的“效率工具”升級為“核心基建”。其工程化能力、流程適配深度、技術(shù)延展性與行業(yè)積淀,直接決定了企業(yè)轉(zhuǎn)型的成效。據(jù)Gartner預(yù)測,到2026
    的頭像 發(fā)表于 10-22 11:49 ?404次閱讀

    外殼防護(hù)等級(IP代碼)全解讀

    什么是外殼防護(hù)等級(IP代碼)IP代碼,全稱為“國際防護(hù)等級”,是由國際電工委員會制定的全球通用標(biāo)準(zhǔn)。這一標(biāo)準(zhǔn)旨在為電子設(shè)備外殼的防護(hù)能力提供一個清晰、統(tǒng)一的評判體系。簡單來說,IP代碼就是電子設(shè)備
    的頭像 發(fā)表于 10-14 12:13 ?1200次閱讀
    外殼防護(hù)等級(IP<b class='flag-5'>代碼</b>)全解讀

    代碼開發(fā)云平臺是什么?零編程零成本搭建

    代碼物聯(lián)網(wǎng)云平臺是種融合了低代碼開發(fā)能力與物聯(lián)網(wǎng)(IoT)技術(shù)的云端服務(wù)平臺,其核心目標(biāo)是大幅降低物聯(lián)網(wǎng)應(yīng)用的開發(fā)門檻和成本,讓用戶無需專業(yè)編程經(jīng)驗,也能快速構(gòu)建、部署和管理物聯(lián)網(wǎng)系統(tǒng)。 低代碼
    的頭像 發(fā)表于 07-31 15:25 ?760次閱讀

    Ansible代碼上線項目實戰(zhàn)案例

    在DevOps浪潮中,自動化部署已經(jīng)成為每個運維工程師的必備技能。今天我將分享一個完整的Ansible代碼上線項目實戰(zhàn)案例,讓你的部署效率提升10倍!
    的頭像 發(fā)表于 07-24 14:03 ?581次閱讀

    單模光纜型號字母代碼及其含義

    單模光纜的型號字母代碼主要用于標(biāo)識光纜的分類、結(jié)構(gòu)、護(hù)層及光纖類型等關(guān)鍵信息,以下是一些常見的單模光纜型號字母代碼及其含義: 一、光纜分類代碼 GY:通信用室外光纜,這是最常見的室外光纜分類
    的頭像 發(fā)表于 07-17 10:27 ?3108次閱讀

    代碼革命的先鋒:aiXcoder-7B模型介紹

    ? ? 國內(nèi)開源代碼大模型 4月9日aiXcoder宣布正式開源其7B模型Base版,僅僅過去一個禮拜,aiXcoder-7B在軟件源代碼托管服務(wù)平臺GitHub上的Star數(shù)已超過2k。同時躋身
    的頭像 發(fā)表于 05-20 14:41 ?804次閱讀
    <b class='flag-5'>代碼</b>革命的先鋒:aiXcoder-7B模型介紹

    OLED代碼分享

    OLED代碼
    發(fā)表于 04-29 17:04 ?1次下載

    變頻器相同的故障原因不同的故障代碼分類

    變頻器相同的故障原因可能對應(yīng)不同的故障代碼,這主要取決于變頻器的型號、制造商以及具體的故障檢測機(jī)制。以下是一些常見的故障原因及其可能對應(yīng)的不同故障代碼分類: 一、過電流故障 ● 故障原因:電動機(jī)銘牌
    的頭像 發(fā)表于 04-25 14:31 ?2555次閱讀
    變頻器相同的故障原因不同的故障<b class='flag-5'>代碼</b>分類

    【JVM開發(fā)者必看】IntelliJ IDEA代碼分析實踐指南:實時糾錯、冗余檢測、自動修復(fù)等

    【IntelliJ IDEA中的代碼分析技巧】靜態(tài)代碼分析是指在不實際運行代碼的情況下掃描代碼以發(fā)現(xiàn)潛在問題。IntelliJ IDEA中的檢查可以在您編譯項目之前檢測到其中的潛在問題
    的頭像 發(fā)表于 03-13 10:34 ?1066次閱讀
    【JVM開發(fā)者必看】IntelliJ IDEA<b class='flag-5'>代碼</b>分析實踐指南:實時糾錯、冗余檢測、自動修復(fù)等