1. 程式人生 > >C++程式碼規範和CodeReview

C++程式碼規範和CodeReview

C++程式碼規範和CodeReview

背景

最近手頭上的開發工作基本已經完成主要功能,其後續進行的工作主要在細小功能的調整和完善上,週末在家看書,想到了CodeReview,想把這件事在組內推廣下(其實CodeReview應該是在開發過程中進行的,現在提出,也是希望以後不要步此後塵)。

說道Review,那就不能不提程式碼規範。

專案中的規範問題:

  1. 是否有編碼規範的意識? 
    開發一個專案,若如果從開始編寫第一行程式碼,大家就有程式碼規範的意識,確屬難能可貴。但大多數情況,很多原因導致我們沒有將此作為一項重要的原則開始。原因也大概無非以下幾類:

    • 時間原因
      :專案開發時間緊迫,根本無法預期專案的進度,還是抓緊時間先實現功能再說
    • 軟體原因:專案開發使用的框架,第三方庫各自有各自的編碼風格
    • 個人原因:每個人也有自己的編碼習慣,一時間很難保持統一
    • 公司原因:公司對編碼要求、編碼稽核沒有強制執行,沒有專人負責,編碼規範形同虛設,完全靠自覺,壓根沒譜
    • 其他:這個很多時候,也有個人怕麻煩、懶啊、等等原因,總之,沒能達到這要求,找藉口一找一籮筐啊。
  2. 選擇什麼樣的規範作為標準呢? 
    這個主要根據程式語言的不同。不同程式語言有自己獨特的特點,C++、Java、javaScript、Python等,語法規則相差很大,風格自然不同。對於不同變成語言,好多知名IT公司都有自己的編碼規範,我們可以以此為參考。

3.統一程式設計規範的意義有那些? 
程式設計規範的形成,主要是為了團隊之間更方便地程式碼閱讀和交流為主要目的,同時也更容易從中分析程式碼錯誤。既然是為了別人閱讀和交流,那就要更加通用和一致,這樣才能有利於交流。 好多不注重規範的程式設計師寫程式碼,都沒有考慮程式碼最後給其他人看。所以寫程式碼也相當隨意。命名、註釋、對齊,等等,完全隨意。結果呢,幾個星期過後,自己開自己程式碼都看不懂了,更別提給別人看。

谷歌的C++程式碼規範

目前,網上流傳最廣的沒過於Google的C++程式碼規範,大家可以有時間進行學習。 Google程式設計規範:https://github.com/google/styleguide

程式碼審查

"在Google,沒有程式,任何產品、任何專案的程式程式碼,可以在沒有經過有效的程式碼審查前提交到程式碼庫裡的"--- Mark CC <<Things Everyone Should Do: Code Review>>

1. 為什麼要進行CodeReview

(1)CodeReview的目的提升程式碼質量,儘早發現常見、普通的缺陷與BUG降低修復成本,同時促進團隊內部知識共享,幫助更多人更好地理解系統;

(2)保證組內人員良好的溝通,使得產品程式碼更容易維護;

2. 從程式碼審查裡能得到什麼?(Mark CC)

  • 在程式碼提交前,用第二群眼睛檢查一遍,防止 bug 混入。

  • 程式碼審查的最大的功用是純社會性的。如果你在程式設計,而且知道將會有同事檢查你的程式碼,你程式設計態度就完全不一樣了。你寫出的程式碼將更加整潔,有更好的註釋,更好的程式結構——因為你知道,那個你很在意的人將會檢視你的程式。

  • 程式碼審查能傳播知識。在很多的開發團隊裡,經常每一個人負責一個核心模組,每個人都只關注他自己的那個模組。除非是同事的模組影響了自己的程式,他們從不相互交流。

進行CodeReview應該遵循哪些基本規則?

(1)需要對CodeReview形成一致的認識,如果在對該事物的認識上存在分歧,那麼會增加CodeReview工作的難度;

(2)需要對基本的編碼規範形成一致性的認知,即形成統一的程式碼規範;

(3)CodeReview必須在程式碼CheckIn之前完成;

(4)CodeReview應從設計到編碼邏輯進行細緻的review,故需要參與成員的緊密溝通合作;

(5)必須準確記錄CodeReview過程中發現的問題,可以使用問題點記錄單;

(6)Review過程中可以要求作者講解,遇到不清楚的邏輯點要處分提問討論;

(7)要形成討論問題、解決問題的氣氛,不能把CodeReview搞成批判大會;

(8)Code的作者應對Code質量負責;

(9)引導輕量Review:如果一次性Review issue過多,會嚴重影響Review的質量;

Google程式碼規範工具Cpplint的使用

下面,來學習下CPPlint工具的使用:

1. 準備測試程式碼:
    #include <iostream>

    using namespace std;

    int main()
    {
        cout<<"hello !"<<endl;

        return 0;
    }
2. 開啟命令提示符,如下,會發現一共有9個錯誤


11個錯誤: 
- 沒有找到版權資訊
- 存在空行
- 不要直接引用名稱空間
- 奇怪的空格在檔案第五行開頭 
- 製表位使用,這個不被推薦,最好使用空格
- ...

3. 按照提示修改問題,新增版權資訊




4. 下一個問題:Line ends in whitespace (行以空格結尾),感覺應該指的是第6行是一個空行,建議刪掉。

刪除空行後顯示:

5. 提示,名稱空間被直接引用
6. 提示存在奇異的空格在行起始



對於一般的編輯工具,都可以顯示特殊治製表符和空格。
VS中

NotePad++中 

7. 刪除空行後,出現新的問題: 左括號應該位於上一行末尾


8. 製表位,建議替換成空格




9. << 符號應該有空格:


10. 行末有空格



11. 總算完了


短短的幾行程式碼,問題如此多。

程式碼質量,任重道遠。

執行程式碼ReView:

下一週,希望大家:自己先給自己程式碼 review,並寫點總結

給點建議:

  1. 選出一段程式碼(一個小功能程式碼:如一個類,或一個或幾個功能函式)
  2. 對選中程式碼進行Review(檢查:編碼規範,邏輯是否正確,條件判斷是否覆蓋了整個邏輯,設計是否合理,程式碼效能,等)
  3. 對比原始碼和修改後的程式碼,進行分析總結
  4. 每個人先準備好演示檔案,進行講解,其他人來提問,來改進。
  5. 個人ppt控制篇幅,不要太長(5-10分鐘)。
  6. 格式不限,自由發揮。

reference:

讓CodeReview成為一種團隊習慣
Google程式碼規範工具Cpplint的使用 

如何進行高效迅速的CodeReview