代碼規範並非官僚主義的產物,而是爲了增長代碼的可讀性,使代碼變得易讀且易維護。書寫符合代碼規範的代碼並不會下降開發效率,相反,這樣作能夠提升人們的開發、維護效率。算法
編程的藝術不是從代碼規範中體現的,代碼的藝術更多的體如今算法設計、數據結構的選取等方面。符合必定的公認的代碼規範只會爲咱們的代碼添彩,不會下降代碼的藝術性。編程
每一個團隊均可以制定本身的代碼規範,可是這也是要創建在必定的公認的基礎上的。由於公認的代碼規範之因此能流傳下來,必定有他的道理,這樣的代碼規範符合人們對代碼的認知,便於你們理解代碼。數組
一個團隊的代碼規範每每須要結合你們的意願來制定,一些規範(好比大括號不換行和大括號換行的兩種信仰……)不能僅聽一我的的,而應符合大多數人的習慣。安全
General數據結構
首先,這位同窗(鑑於如下言論中的負面影響較多,就不公佈該同窗的名字了……)的代碼並不能正常工做。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啊,一些稀奇古怪的數字全都冒出來了……單元測試
此外,這位同窗也沒有進行算式的重複性檢查,從剛剛展現出來的那句話來看,明顯也沒有實現第二個功能(即讀取題目和答案,給出評測結果的功能)測試
從代碼邏輯性來看,(先拋開奇葩的輸入格式),數字的輸出問題是因爲程序嚴重的邏輯缺陷致使的。
這位同窗直接生成了一個分數的整數部分,分子部分和分母部分,而後沒有任何判斷的就直接輸出了相應的部分,顯然會因爲隨機函數的問題致使各類各樣的無效分數。
此外,這位同窗算式的生成也有很大問題,輸出格式很是死,這樣會致使不少有效的算式不能被生成。
嗯,這位同窗的代碼寫的確實有點迷,可是至少我仍是能看懂的……一些函數好比
Gcd()
啊、getNum()
(得到隨機數)啊、gettwonum()
啊之類的也都進行了封裝,雖然我對這樣封裝是否合理持懷疑態度,可是至少代碼讀起來不是毫無頭緒。只不過算式的存儲形式這位同窗直接採用了好多個數組,雖然有註釋可是我仍是看了很久才明白這些數組都是幹嗎用的……
因爲以前是我的項目,因此個人代碼規範並不適用於這位同窗,不過這位同窗的代碼仍是符合通用的規範的(雖然有很大一部分重複的代碼讓人讀起來很不爽……)
以前已經提到了,有不少(大概100行)重複的代碼,這是由於這位同窗每次隨機生成一個分數都寫了大概十行代碼,而後又分了三種狀況(三種運算符數量),這就致使重複使用了不少次生成一個分數的過程,建議這位同窗將這段代碼封裝爲一個方法。其餘一些小的代碼冗餘這裏就不說起了。(放這位同窗一條生路吧……)
顯然沒有……最大的問題就是我剛剛提到的生成分數的過程沒有徹底封裝。不過,這位同窗封裝了getnum、gettwonum、getthreenum這樣的方法,在我看來,這些方法僅須要一個getnum就夠了,其餘的方法其實不必……
這位同窗的代碼中雖然僅出現了temp一、temp二、temp3三個全局變量(大概就是用於getnum之類的函數與外部交互的),可是這也徹底不必……
這位同窗的代碼其實挺乾淨的,沒有被註釋掉的代碼。
沒有錯誤。這位同窗整個代碼僅使用了一個for循環,就是輸出n個算式的for循環,這個想出錯都難……
這位同窗的代碼其實僅實現了一部分功能,就這部分功能來講,沒有能夠被替換爲庫函數的代碼段。
這個代碼中沒有任何用於調試的代碼段。
Security
就這位同窗的程序來講,確實對說有讀入的安全性均進行了檢查(由於讀的全是整數嘛……)可是因爲一些功能沒有實現,因此對於一些本應爲正確的輸入,這位同窗有可能會返回input error的信息。
沒有用到第三方代碼……
輸出值沒有通過檢查,這也是致使輸出1'1/1之類數字的一個緣由吧。
無效的參數確實進行了處理,可是一些有效的參數也被認爲是無效的了……(前提是認爲他的輸入方式是正確的)
Documentation
關於文檔這方面,相信不少同窗都沒有作,所以這裏就再也不一一贅述了。這位同窗至少是有一些註釋的,雖然註釋的格式有待規範,可是這個習慣其實挺好的。帶一些註釋的話會使CodeReview以及本身調試的時候變得很是方便。
Test
測試這方面也是咱們第一次做業所欠缺的,據我瞭解,仍是有一部分同窗作了單元測試的(好比鳴神),可是我不清楚他的代碼覆蓋率如何……不少同窗(包括我在內)也都沒有作單元測試,和我結對的這位同窗也沒有作。不過就他寫的這幾個函數來看,應該是能夠經過單元測試的……通過實際測試,也確實經過了單元測試(都是很簡單的函數嘛……)
在作CodeReveiw時候,我也在想個人代碼若是進行這樣的CodeReview的話,結果會如何。我第一次做業的代碼在實現時其實並無徹底按照我設計的初衷來作,這也直接致使了個人代碼在表達式的存儲、表達式去重的方面的代碼可讀性較差。這是在之後的編碼中須要特別注意的問題。
此外,咱們在作項目的時候都很欠缺對文檔的分析以及嚴謹的測試過程,這實際上是一個很是很差的習慣。就我來講,代碼中沒有任何註釋,也沒有任何說明文檔。雖然此次做業的代碼其實並不長,可是按照尹寶林
老師的觀點,生存週期超過1天的代碼就應該有相應的註釋,這樣才便於維護和繼續開發。
關於測試,單元測試實際上是一個很好的檢查bug的方法,可是咱們每每都會由於單元測試太過繁瑣而不去作。這樣作在一我的開發的時候,或許體現不出來,由於本身對本身的代碼都比較瞭解。可是若是到了團隊項目中,你們都不作單元測試,那麼若是出現了bug,你們就很難發現是誰的代碼出現了問題。而在作了單元測試以後,這樣的狀況就會減小不少。出現的問題更多的會是沒有考慮全狀況,而不是已有代碼出了錯誤。