chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

什么是整潔的代碼

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

命名的藝術

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

好的命名應該有下面的特征:

名副其實

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

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

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

避免誤導

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

有意義的區(qū)分

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

#bad
defcopy(a_list,b_list):
pass

#good
defcopy(source,destination):
pass

使用讀的出來的單詞

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

使用方便搜索的命名

名字長短應與其作用域大小相對應

避免思維映射

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

注釋

有表達力的代碼是無需注釋的。

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

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

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

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

good
if(employee.isEligibleForFullBenefits())

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

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

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

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

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

函數(shù)

函數(shù)的單一職責

一個函數(shù)應該只做一件事,這件事應該能通過函數(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ù)中的語句都要在同一個抽象層級,不同的抽象層級不能放在一起。比如我們想把大象放進冰箱,應該是這個樣子的:

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

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

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

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

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

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

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

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

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

Dont repear yourself

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

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

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

測試

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

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

即使針對核心模塊寫了單元測試,一般也很隨意,認為這只是測試代碼,配不上生產(chǎn)代碼的地位,以為只要能跑通就行了。這就導致測試代碼的可讀性、可維護性非常差,然后導致測試代碼很難跟隨生產(chǎ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準則:

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


審核編輯 :李倩


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

    關注

    31

    文章

    5925

    瀏覽量

    90126
  • 代碼
    +關注

    關注

    30

    文章

    4965

    瀏覽量

    73868

原文標題:什么是整潔的代碼

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

    HarmonyOS應用代碼混淆技術方案

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

    TE Connectivity推出全新雙槽SIAMEZE端子

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    OLED代碼分享

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

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

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

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

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

    貼片電感的感值代碼與讀取方法

    貼片電感作為電子電路中的重要元件,其感值的準確性和讀取方法的便捷性對于電路的性能至關重要。本文將詳細介紹貼片電感的感值代碼及其讀取方法。 貼片電感的感值代碼通常采用數(shù)碼表示法,這種方法通過特定的數(shù)字
    的頭像 發(fā)表于 03-06 14:15 ?1781次閱讀
    貼片電感的感值<b class='flag-5'>代碼</b>與讀取方法

    嵌入式軟件開發(fā)中遺留代碼的挑戰(zhàn)

    遺留代碼通常難以集成到其他系統(tǒng)、適配新數(shù)據(jù)格式或部署到現(xiàn)代平臺及云端托管環(huán)境。相關代碼可能已不再提供安全更新和補丁,供應商或開源社區(qū)的支持也可能逐漸減少甚至消失。然而,如果使用遺留代碼不可避免,本文給出一些最佳實踐建議。
    的頭像 發(fā)表于 02-26 10:05 ?787次閱讀
    嵌入式軟件開發(fā)中遺留<b class='flag-5'>代碼</b>的挑戰(zhàn)