編碼是一個認真思考的過程,如何有效提高代碼的可讀性?

2020-11-20 C語言進階之路

編寫代碼,實質是在梳理邏輯,為了完善整個邏輯流程,我們借用程式語言的變量、函數、流程控制、循環、注釋、方法等串接起來,完善一套系統的邏輯。

為了完善這套邏輯,我們藉助了許多工具:設計方法、架構設計、項目組織等。

意識到沒有,代碼的好壞一定程度上可以從邏輯層面評判。

  • 符合邏輯,不一定是最優的代碼
  • 不符合邏輯,一定不是好的代碼

從這層面來看,梳理邏輯極為重要,邏輯通了,剩下的就是實現了。

邏輯的串接靠的是程式語言的變量、函數、流程控制、循環、注釋等。

本文從這些層面講述,如何編寫可讀代碼。

0. 規範

絕大多數的人,不會從零完整的完成一個複雜的項目,大多是團隊共同合作,完成一個大的項目。

這個時候,假如你是中途參與進來。你在實現邏輯的時候,你是照著自己的邏輯來還是依照團隊的風格來。

比如項目組織,命名等...

依照團隊的風格來

尤其針對複雜的上線的項目,完整的理解整個項目都存在困難,這個時候,風格統一尤其重要。

是的,這個時候,風格一致性重要,當然具體的實現邏輯,還是應該遵從易於理解這個大方向。

1. 程式語言規範

準則:堅持程式語言的風格

每門程式語言,都存在一定的規範,這個時候,程式語言的整體規範需要遵從。

大家可能會多參考 google 出品的各種程式語言規範。方向沒錯。

2. 命名

  • 變量
  • 函數
  • 方法

準則:易於理解

如何做到易於理解:

  • 專業的單詞:使用領域內的單詞
  • 避免空泛的名字
  • 具體的名字
  • 變量名帶上更多細節
  • 不使用令人誤解的名字
  • 布爾值命名
  • 不建議使用的單詞

2.1 領域內的單詞

這個和項目相關,比如系統是個智慧零售後臺,那麼領域內單詞多是:顧客、商品、商鋪、店員、店長、價格等。

  • customer
  • produce
  • shop
  • shopLeader
  • price

2.2 避免空泛的名字

變量的命名一般要賦予一定的意義,極少情況下可以使用沒有什麼意義的單詞。比如最常見的:

var ( numberOne int temp int numberTwo int)tmp = numberOnenumberOne = numberTwonumberTwo = tmp

再比如:

var i intfor i=0;i<10;i++{ fmt.Println(i)}

這種沒什麼意義的單詞,一般適用於局部作用域。

儘量少用。

2.3 具體的名字

完成什麼任務就使用什麼單詞。一般變量使用名詞居多,函數使用動詞開頭居多。

函數多用動詞,變量多用名詞

比如:

var toString = func(){}var serverLoop = func(){}var pages int var userName string

2.4 帶上更多細節

一般命名不建議過長,也不建議過短,那多長,多短合適呢?

最長三個單詞的長度吧

如何帶上更多的細節。

  • 嘗試使用後綴
  • 嘗試使用單位
  • 嘗試指向具體的細節

比如:

var timeIntervalMsvar lengthCmvar delaySecsvar sizeMbvar maxKbpsvar degreesCwvar numberMaxvar numberMinvar numberFirstvar numberLast

贈送幾組對仗的後綴:

  • max/min
  • first/last
  • begin/end ...

ServerCanStart() 不如 CanListenOnPort()

2.5 不使用令人誤解的詞

比如:Filter 在資料庫操作中容易使用這個單詞,這個單詞沒有帶上更多的細節,實質上在使用的過程中,還是需要查看編寫的SQL 語句等才能知道具體的過濾細節。整體思考多了幾步。不易讓人理解。

建議多讀幾遍自己命名的單詞

2.6 布爾值

提到布爾值,因為就存在兩種結果。所有,一般使用是否這樣意思的詞。

比如:

var ( ok bool notOk bool)var ( is bool)var ( has bool)var ( found bool)var ( should bool)var isCompany = func(){}var isVip = func(){}var hasSpace = func(){}

2.7 不建議使用的單詞

  • get
  • read
  • util

恰恰這幾個單詞,在寫代碼中最容易使用。選擇替代方案。

贈送一波動詞:

- senddeliver、dispatch、announce、distribute、route- findsearch、extract、locate、recover- startlaunch、create、begin、open- makecreate、setUp、build、generate、compose、add、new

3. 設計

一份好的幻燈片演示設計需要考慮什麼?

  • 符合場景的配色,確定原始基調
  • 符合場景的事物,借用來表達觀念
  • 統一整體風格
  • 對齊、重複、親密、比較

看到沒,幻燈片演示設計,強調場景化,選擇適合場景的主體和配色,比如黨政風格,當然選擇國旗色;比如學術答辯,當然選擇藍色;比如手機發布會,當然使用暗黑科技風格...

所以代碼也需要場景化,選擇符合場景的單詞等

這裡以設計的四個規範類比代碼的組織。

3.1 對齊

程式語言為什麼強調縮進?難道不是為了閱讀代碼的人更容易看懂代碼嗎?寫代碼的人更容易組織代碼嗎?僅僅是設計者為了好玩?

當然不是。

舉例:編寫web路由和控制器

// student.gofunc Register(r *gin.Group) { r.POST("/v1/api/students", PostHandler) r.GET("/v1/api/students/:sid", GetHandler) r.PATCH("/v1/api/students/:sid", PatchHandler) r.PUT("/v1/api/students/:sid", PutHandler) r.DELETE("/v1/api/students/:sid", DeleteHandler)}

  • 放眼望去,確實知道實現什麼任務
  • 風格統一
  • 整整齊齊

這個例子可能解釋對齊,不夠友好。

再舉個例子:

CheckFullName("No Such Guy","", "not match found")CheckFullName("John", , "", "more than one resule")

3.2 重複、親密、比較

當然,作為程式設計師,最應該避免的其實就是寫重複的代碼,一般的做法往往是提煉,將重複的抽象出一個函數之類的。這裡的重複,是風格的統一

// teacher.gofunc Register(r *gin.Group) { r.POST("/v1/api/teachers", PostHandler) r.GET("/v1/api/teachers/:tid", GetHandler) r.PATCH("/v1/api/teachers/:tid", PatchHandler) r.PUT("/v1/api/teachers/:tid", PutHandler) r.DELETE("/v1/api/teachers/:tid", DeleteHandler)}

可以結合比較下 student.go 和 teacher.go

這樣的組織方式,講道理,並不太會給閱讀代碼的人帶來太多的認知負擔。

  • 一致的順序
  • 始終一致的使用,使用戶其實閱讀一個,類似的都能秒懂

3.3 留白

設計領域頁面的設計,並不強調內容越多越好,恰當的在頁面上留有空白,使整體設計有呼吸感。

那編程如何實現留白?

  • 恰當的換行,使相似的內容更緊湊
  • 提取,使用方法來組織不規範的東西
  • 代碼分段

假如你一個函數需要寫 100 多行,不好意思,我可能建議你,不要這麼做。

  • 拆分,邏輯梳理、提取方法
  • 儘量維持最長 30~50行左右(這樣使屏幕能裝載下,一次就能完成的閱讀整個函數的邏輯)

4 注釋

準則:幫助閱讀代碼的人對代碼了解的和寫代碼的人一樣多

  • 什麼時候不需要注釋
  • 什麼時候需要注釋

4.1 什麼時候不需要注釋

是的,前文的一系列準則,命名啊之類的,是內容,也是注釋,通過閱讀變量、函數名等就了解了代碼完成的任務。

這樣的地方不需要注釋,因為顯而易見,從代碼本身就能推斷事實。

有時候可能需要考慮是不是命名不好,導致需要注釋,這個時候,命名優於注釋。

給不好的代碼注釋,和在錯誤的路上持續努力一樣令人可怕。

4.2 什麼時候需要注釋

  • 關鍵點
  • 缺陷點
  • 常量
  • 全局注釋
  • 總結性注釋

關鍵點

有些時候,僅僅靠之前的「表面工作」 已經不能完全能夠滿足讓人易於理解。這個時候需要在關鍵點添加注釋。

缺陷點

是的,承認自己的代碼寫的不是最優的,僅僅只是實現,還存在更優的辦法,所以需要在有缺點的地方加上注釋。

常量:(各程式語言建議常量大寫)

給常量注釋,賦予了更多的意義。

比如:

NUMTHRADS = 8 // as long as it is >= 2 * number_processors, that is good enough.

好,假如你正在優化代碼,看到這注釋,是的,你知道該如何調整了。

全局注釋

一般在文件開頭,表明文件內代碼完成的任務。

總結性注釋

一般函數開頭,表明函數代碼完成的任務。

其他

潤色語句。言簡意賅由於冗長的解釋。


以上就是代碼表面整潔規範的標準和建議,希望大家都能敲出高效、整潔的代碼。


C語言是每個想要學習編程的小夥伴首要學習的語言~如果你也希望成為一個好的程式設計師,了解C語言更多知識,點擊下方【了解更多】,接受牛人大牛們的指導,聽聽他們對寫代碼的建議,一起快樂學習,共同進步~

相關焦點

  • 快速提高代碼的可維護性與可讀性
    其實在程式設計師的生活中,去編寫一段可維護性強的代碼會讓他們在程式設計師之間得到更好的口碑。那麼該如何提高代碼的可維護性與可讀性呢?我會在文中進行一一解釋。注釋你的代碼/*注釋你的代碼至關重要,因為如果你編寫了一個程序卻未對其進行注釋,那麼缺少注釋將使你浪費時間來重新寫一遍代碼。畢竟基本上就算是你自己寫的代碼,幾個月不看那肯定就忘了。所以注釋代碼又幫助了別人也幫助了你自己。當然如何注釋好代碼又是一門學問了,已經超出了本文的討論範圍,如果讀者有興趣,我會在之後的文章中寫如何注釋好代碼。
  • 如何提高代碼質量
    但我覺得,代碼質量總結起來就兩個:好看和好用。好看是指代碼可讀性好,容易理解、容易維護,別人接手了不罵你;好用則指代碼健壯,不容易出錯,機器跑著不罵你。即使出錯,也容易定位,容易止損和恢復。前面小編也發布幾篇優質的代碼規範文章: 為何需要提高代碼質量?
  • 如何提高代碼可讀性,再教你一招
    如何提高代碼可讀性,再教你一招Hello,各位小夥伴,在前面的幾個章節中,我們重點講解了編程規範,其中對PEP8和Google編程規範進行了解讀,其中對代碼的縮進、行數、命名、注釋等都有明確的規範,似乎我們按照這樣的編程規範進行規範性寫代碼就可以了。
  • 如何有效地進行代碼 Review?
    都將獲得成長,在 Review 過程中參與人就具體的問題展開深入的討論,無論是怎麼寫出整潔的代碼、怎麼更好地更全面地思考問題、怎麼最佳地解決問題,參與人都可以互相取長補短,互相提高。通過具體代碼實現進行的討論往往是最深入和有效的,代碼 Review 是開發者提高代碼能力最重要的途徑之一。
  • 如何編寫可讀性代碼
    作者:極鏈科技 湯紅燕什麼叫可讀性代碼?簡單來說,就是易於理解、耗腦時間少、可維護性較高的代碼。編寫可讀性代碼把信息裝到名字裡(一個好的名字可以承載很多信息)1. 選擇專業的詞(避免「空洞」)比如函數 getUserInfo( ) 是用來獲取用戶信息,但是,是從接口中獲取的信息呢?
  • 作為程式設計師,該如何提高自己的編程水平?
    一般程式設計師約定的編碼水平是指代碼的正確性、代碼的邏輯性及代碼的可讀性三個方面。那作為一個程式設計師,應該如何提高自己的編程水平呢?一、提高代碼的正確性1、編程手冊代碼的正確性反映了工程師對一門語言的掌握程度,這是一個日積月累的過程。
  • 這三個技巧,讓你的代碼可讀性提高300%
    本文不是在討論算法、數據結構、軟體架構和程序設計,而是在討論一些更基本、更重要的東西:可讀性。原始碼是程式設計師耗盡了心血和精力的作品,所以不應當存在「快刀斬亂麻」的現象。忽視這些規定看似讓代碼生成速度加快,但事實上往往導致事倍功半。代碼敲一次,閱讀無數次。因此,優化代碼提高可讀性顯得尤為重要。為了幫助生成高度可讀的代碼,本文歸納總結了必須遵守的3個重要規定。
  • 提高可讀性,3 個讓代碼更簡潔的小技巧
    在完成代碼重構之後,我總是會獲得一種莫名的成就感。其實,不僅是大規模的代碼重構能給我帶來這種感覺,一些小的修改也能讓我感到很高興。以下3個簡單的重構技巧就能幫你改善代碼的可讀性。
  • 我從高級開發者身上學到的19條編碼原則
    在這篇文章中,一位全棧首席開發者總結了高級開發人員的 19 個編碼原則,可以幫助新手少踩些坑。進行軟體開發,整天敲代碼、好不容易調試成功,但是代碼的質量堪憂,可讀性不是很高,反過頭來還得對代碼進行完善。也許這不是你的編碼能力問題,很有可能在你進行代碼編寫時,一些看似不重要的編碼注意事項沒有遵守。
  • 4個技巧,提高文章可讀性
    無論是投稿也好,發表也好,都需要注意文章格式,提高文章的可讀性。如何才能提高文章可讀性,讓編輯一眼就相中自己的文章,或者發表後讓更多人願意讀呢?今天推薦一本書叫做《一本小小的紅色寫作書》。這本書從結構、風格和可讀性三個方面列舉了20條高效的寫作原則,包括如何規劃表述的觀點和順序,如何恰當的例證以及如何增加文章的易讀性,這些寫作技巧適用於所有類型的寫作。
  • 乾貨分享:六大招教你有效進行代碼Review
    我們都知道提高代碼能力一個有效的途徑是閱讀優秀的項目代碼,但是閱讀項目代碼有著不小的難度,這也是大部分人沒有去執行的原因,而 Review 資深同事的代碼,我們在閱讀代碼的同時能夠直接進行有效的溝通,這是一個快速有效的學習途徑,尤其對開發經驗還不算豐富的開發者而言。
  • 在淘寶,我們是這樣衡量代碼質量的
    本篇文章主要聊一下在團隊開發過程中,如何做到代碼質量的管控與提升。首先需要有一套規範,定義什麼是好的代碼,再通過一些工具,幫助我們在實踐規範的過程中,更好地遵循規範。代碼質量評價標準答案是有的。這裡簡單分享當下較常用的評價標準,其中包括:編碼規範、可讀性、可維護性、重複度及可測試性。
  • 騰訊開發工程師乾貨分享:六大招教你有效進行代碼 Review
    3)個人快速成長通過有效的代碼 Review,Author 和 Reviewer 都將獲得成長,在 Review 過程中參與人就具體的問題展開深入的討論,無論是怎麼寫出整潔的代碼、怎麼更好地更全面地思考問題、怎麼最佳地解決問題,參與人都可以互相取長補短,互相提高。
  • 你的代碼「balance」怎麼樣?找到簡潔性和可讀性的平衡點
    圖源:unsplash4.使用enumerate()和zip()進行迭代編碼的一個關鍵原則是精簡。當處理一系列數據(如數字列表)時,通常需要對列表中的每個數字執行相同的操作。Name: John; Score: 95Name: Danny; Score: 99Name: Jennifer; Score: 100基本上,zip()函數所做的就是從迭代中獲取每個元素,以便在每次迭代中形成一個有順序的元組。這樣一來代碼會更簡潔,可讀性也更高。
  • 編碼,編到最後一無所有?不,你會從編碼的過程中獲得很多
    可能有幾個原因,這些是: 1.您是一個非程式設計師,想知道在這個技術時代如何工作。您對技術感興趣,正在考慮選擇此路徑。 2.您是一個初學者,但是您對自己的未來很迷惘。您不知道這樣走下去是對是錯。 3.您是一位經驗豐富的人,您想知道在選擇編程之後,您在編程過程中走了多遠以及經歷了哪些更改。
  • 提高代碼可讀性的十大注釋技巧分享
    【IT168 技術】很多程式設計師在寫代碼的時候往往都不注意代碼的可讀性,讓別人在閱讀代碼時花費更多的時間。其實,只要程式設計師在寫代碼的時候,注意為代碼加注釋,並以合理的格式為代碼加注釋,這樣就方便別人查看代碼,也方便自己以後查看了。下面分享十個加注釋的技巧:  1.
  • 代碼整潔小技巧:15個簡單的JS編碼標準
    編碼標準可以幫助以下方面:保持代碼一致易於閱讀和理解易於維護下面的編碼標準是我對上述幾點有幫助的看法。Fail: var myVar = 10;複製代碼Pass: let myVar = 10;複製代碼在學習web前端的過程中,難免會遇到很多的問題,這些問題可能會困擾你許久,為此我有個web開發學習交流群( 545667817
  • SEO技巧:提高內容可讀性來促進客戶轉化
    那麼,您如何保持訪客的注意力足夠長的時間進行轉換?您的內容質量可能不是問題。許多企業在努力提高網站的可讀性。您的訪客希望快速方便地找到所需信息,而無需滾動瀏覽。你是怎樣做的?在本文中,我們將探討內容可讀性的主題,並為您提供一些簡單的技巧,以提高網站的可讀性,從而提升轉化率。隨著技術的發展,單擊按鈕即可隨時獲得世界範圍的知識。
  • 淺析提高英語科技論文可讀性的有效途徑
    在行文過程中普遍表現在廣泛使用被動語態、非限定動詞、名詞化結構等方面,為了表述一個複雜概念,使之邏輯嚴密,結構緊湊,往往需要出現許多長句。達晉編譯認為,把英語科技論文的一些共同特點進行歸納與分析,是提高英語論文可讀性的有效途徑。一、廣泛使用被動語態。根據英國利茲大學John Swales的統計,英語科技論文中的謂語至少有三分之一是被動語態。
  • 軟體安全開發非常實用的編碼原則
    在做好安全軟體開發的準備之後,開發團隊還應當清楚一些安全編碼的基本原則,這是開發任何健壯、安全軟體的重要基礎。針對軟體安全編碼,國際國內很多組織、機構、公司和信息安全專家各自提出了一些編碼原則,以保證得到安全的代碼。常見的安全編碼原則包括以下內容。