第二次博客做業——代碼規範的討論以及同伴代碼複審

對因而否須要有代碼規範的幾種觀點


  • 這些規範都是官僚制度下產生的浪費你們的編程時間、影響人們開發效率, 浪費時間的東西。

代碼規範並非官僚主義的產物,而是爲了增長代碼的可讀性,使代碼變得易讀且易維護。書寫符合代碼規範的代碼並不會下降開發效率,相反,這樣作能夠提升人們的開發、維護效率。算法

  • 我是個藝術家,手藝人,我有本身的規範和原則。

編程的藝術不是從代碼規範中體現的,代碼的藝術更多的體如今算法設計、數據結構的選取等方面。符合必定的公認的代碼規範只會爲咱們的代碼添彩,不會下降代碼的藝術性。編程

  • 規範不能強求一概,應該容許不少例外。

每一個團隊均可以制定本身的代碼規範,可是這也是要創建在必定的公認的基礎上的。由於公認的代碼規範之因此能流傳下來,必定有他的道理,這樣的代碼規範符合人們對代碼的認知,便於你們理解代碼。數組

  • 我擅長制定編碼規範,大家聽個人就行了。

一個團隊的代碼規範每每須要結合你們的意願來制定,一些規範(好比大括號不換行和大括號換行的兩種信仰……)不能僅聽一我的的,而應符合大多數人的習慣。安全

結對夥伴第一次做業的代碼複審


General數據結構

  • Does the code work? Does it perform its intended function, the logic is correct etc.

首先,這位同窗(鑑於如下言論中的負面影響較多,就不公佈該同窗的名字了……)的代碼並不能正常工做。app

打開源文件,找到main函數,看到第一句話我就驚呆了……函數

if (scanf_s("Myapp.exe -n %d -r %d", &n, &r) != 2 || n > 10000 || n < 0){
  printf("input error");
  return 0;
}

這尼瑪就是傳說中的命令行參數!!??好吧,這些細節暫不考慮,暫且認爲就是這樣的輸入吧,我隨手輸入了一組測試用例,而後我又一次驚呆了……oop

沒用文件輸出就算了,連答案都沒生成,算式中還有一些奇怪的數字……什麼1'1/1啊,0’6/6啊,一些稀奇古怪的數字全都冒出來了……單元測試

此外,這位同窗也沒有進行算式的重複性檢查,從剛剛展現出來的那句話來看,明顯也沒有實現第二個功能(即讀取題目和答案,給出評測結果的功能)測試

從代碼邏輯性來看,(先拋開奇葩的輸入格式),數字的輸出問題是因爲程序嚴重的邏輯缺陷致使的。

這位同窗直接生成了一個分數的整數部分,分子部分和分母部分,而後沒有任何判斷的就直接輸出了相應的部分,顯然會因爲隨機函數的問題致使各類各樣的無效分數。

此外,這位同窗算式的生成也有很大問題,輸出格式很是死,這樣會致使不少有效的算式不能被生成。

  • Is all the code easily understood?

嗯,這位同窗的代碼寫的確實有點迷,可是至少我仍是能看懂的……一些函數好比Gcd()啊、getNum()(得到隨機數)啊、gettwonum()啊之類的也都進行了封裝,雖然我對這樣封裝是否合理持懷疑態度,可是至少代碼讀起來不是毫無頭緒。只不過算式的存儲形式這位同窗直接採用了好多個數組,雖然有註釋可是我仍是看了很久才明白這些數組都是幹嗎用的……

  • Does it conform to your agreed coding conventions? These will usually cover location of braces, variable and function names, line length, indentations, formatting, and comments.

因爲以前是我的項目,因此個人代碼規範並不適用於這位同窗,不過這位同窗的代碼仍是符合通用的規範的(雖然有很大一部分重複的代碼讓人讀起來很不爽……)

  • Is there any redundant or duplicate code?

以前已經提到了,有不少(大概100行)重複的代碼,這是由於這位同窗每次隨機生成一個分數都寫了大概十行代碼,而後又分了三種狀況(三種運算符數量),這就致使重複使用了不少次生成一個分數的過程,建議這位同窗將這段代碼封裝爲一個方法。其餘一些小的代碼冗餘這裏就不說起了。(放這位同窗一條生路吧……)

  • Is the code as modular as possible?

顯然沒有……最大的問題就是我剛剛提到的生成分數的過程沒有徹底封裝。不過,這位同窗封裝了getnum、gettwonum、getthreenum這樣的方法,在我看來,這些方法僅須要一個getnum就夠了,其餘的方法其實不必……

  • Can any global variables be replaced?

這位同窗的代碼中雖然僅出現了temp一、temp二、temp3三個全局變量(大概就是用於getnum之類的函數與外部交互的),可是這也徹底不必……

  • Is there any commented out code?

這位同窗的代碼其實挺乾淨的,沒有被註釋掉的代碼。

  • Do loops have a set length and correct termination conditions?

沒有錯誤。這位同窗整個代碼僅使用了一個for循環,就是輸出n個算式的for循環,這個想出錯都難……

  • Can any of the code be replaced with library functions?

這位同窗的代碼其實僅實現了一部分功能,就這部分功能來講,沒有能夠被替換爲庫函數的代碼段。

  • Can any logging or debugging code be removed?

這個代碼中沒有任何用於調試的代碼段。

Security

  • Are all data inputs checked (for the correct type, length, format, and range) and encoded?

就這位同窗的程序來講,確實對說有讀入的安全性均進行了檢查(由於讀的全是整數嘛……)可是因爲一些功能沒有實現,因此對於一些本應爲正確的輸入,這位同窗有可能會返回input error的信息。

  • Where third-party utilities are used, are returning errors being caught?

沒有用到第三方代碼……

  • Are output values checked and encoded?

輸出值沒有通過檢查,這也是致使輸出1'1/1之類數字的一個緣由吧。

  • Are invalid parameter values handled?

無效的參數確實進行了處理,可是一些有效的參數也被認爲是無效的了……(前提是認爲他的輸入方式是正確的)

Documentation

關於文檔這方面,相信不少同窗都沒有作,所以這裏就再也不一一贅述了。這位同窗至少是有一些註釋的,雖然註釋的格式有待規範,可是這個習慣其實挺好的。帶一些註釋的話會使CodeReview以及本身調試的時候變得很是方便。

Test

測試這方面也是咱們第一次做業所欠缺的,據我瞭解,仍是有一部分同窗作了單元測試的(好比鳴神),可是我不清楚他的代碼覆蓋率如何……不少同窗(包括我在內)也都沒有作單元測試,和我結對的這位同窗也沒有作。不過就他寫的這幾個函數來看,應該是能夠經過單元測試的……通過實際測試,也確實經過了單元測試(都是很簡單的函數嘛……)

一些感想


  • 在作CodeReveiw時候,我也在想個人代碼若是進行這樣的CodeReview的話,結果會如何。我第一次做業的代碼在實現時其實並無徹底按照我設計的初衷來作,這也直接致使了個人代碼在表達式的存儲、表達式去重的方面的代碼可讀性較差。這是在之後的編碼中須要特別注意的問題。

  • 此外,咱們在作項目的時候都很欠缺對文檔的分析以及嚴謹的測試過程,這實際上是一個很是很差的習慣。就我來講,代碼中沒有任何註釋,也沒有任何說明文檔。雖然此次做業的代碼其實並不長,可是按照尹寶林老師的觀點,生存週期超過1天的代碼就應該有相應的註釋,這樣才便於維護和繼續開發。

  • 關於測試,單元測試實際上是一個很好的檢查bug的方法,可是咱們每每都會由於單元測試太過繁瑣而不去作。這樣作在一我的開發的時候,或許體現不出來,由於本身對本身的代碼都比較瞭解。可是若是到了團隊項目中,你們都不作單元測試,那麼若是出現了bug,你們就很難發現是誰的代碼出現了問題。而在作了單元測試以後,這樣的狀況就會減小不少。出現的問題更多的會是沒有考慮全狀況,而不是已有代碼出了錯誤。

相關文章
相關標籤/搜索