Code Style(代碼的風格)
2019-11-17 05:43:35
供稿:網友
1. 簡介
2. 什么是風格?
3. 代碼的風格為什么如此重要?
4. 更少的工作,更多的文檔?
5. 推薦的代碼風格
6. 簡單的文檔
7. 輸出風格
8. 結論
簡介
讓我們面對一下吧…假如您是一個資深的程序員,那么您總是在最后期限下工作并且您的最終目標是完成您設計的軟件。假如您是個新手,您的努力是更多的研究、試驗、當然還有錯誤和一心希望您的程序可以象打算的那樣運行。不管怎樣,當您的程序真的如愿以償的運行時那種成功的感覺令人十分振奮,但更多的程序員發現能夠用良好的風格生成程序內部代碼時的那種自豪的感覺更棒。
假如您是程序設計小組的成員或者假如您還在書寫學校分配的任務,那么您會有機會被要求遵守某些必須遵守的風格規則。 絕大多數的程序員考慮風格這件事就象一個10歲大的孩子看待就寢時間一樣。但資深程序員和我所見過的小組領導及多年來使用許多風格的程序員都會試圖向您傳達良好的代碼風格與您所自得的一些書寫代碼的技巧同樣重要。在這篇文章中我將嘗試包括一些輸出風格的觀點,這也許有助您的編程旅程。
更少的工作,更多的文檔?
因此風格意味著要在代碼的每一行加上注解,對嗎?錯。假如沒有做對的話,注解也會變成一場災難。 我仍然希望一個程序員學會喜歡輸入注解或真正對注解有足夠的重視。為了未來的可維護性必須強制自己正確的放置注解。所以怎么能夠不使用注解?
顯然對一個新手最困難的事是懂得什么是好的變量命名。讓我們看看以下的代碼。您能告訴我下面的代碼是做什么的嗎?
float __fastcall TExampleForm::CalcAverageGrade(void)
{
int y=0;
int i=0;
for (i; i<x; i++) {
y=y+g[i];
}
return float(y/x);
}
在上面的例子中,您能很輕易的告訴我y代表什么呢?x又是什么呢?這段代碼也許需要一些注釋來解釋這些變量的代表意義及代碼中發生了什么?應用以上的代碼風格,看不出什么邏輯關系?,F在讓我們看看應用更好的代碼風格以后,代碼是何等模樣?
float __fastcall TExampleForm::CalcAverageGrade(void)
{
int total=0;
for (int i=0; i<maxGrades; i++)
{
total+=Grades[i];
} //求所有成績的和
return float(total/maxGrades);
} //計算平均成績
在您除錯時以上兩段代碼孰優孰劣,已不必多說?,F在就讓我們討論一些能夠讓您的代碼更具有可維護性的推薦風格吧。
推薦的代碼風格
1. 使用有描述意義的變量名。
2. 使用i, j, k, l, m作為循環計數變量。這起源于Fortran,自始自終這都是事實上的工業標準。
3. 在閉合括號處為所有的聲明和方法注釋。這樣在嘗試找到與此配對的上一個初始括號時更輕易做決定,尤其在聲明很長時。
4. 考慮將if后面或循環定義體的初始括號放在一個單獨的行上。這真的有助于您找到與其對應的閉合括號。
5. 使用適當的組合運算符 (+=, *=, 等等)。對自增(自減)變量使用++ 和 -–運算符。正確使用這些運算符會使您的代碼更可讀和更一致。這也減少了輸入的字符數量。組合運算符也會幫助編譯器生成更快的代碼。舉例來說,i++產生的asm(匯編)代碼是inc [i],而i=i+1將會產生如下的asm(匯編)代碼mov eax,[i] inc eax mov [i],eax。
6. 注解代碼時,要明智些!假如一段代碼的邏輯關系很復雜,注解將有助于別人理解代碼的意圖。但假如邏輯關系直線向前,避免加上并非必須的注解。要象維護您的代碼一樣維護您的注解!
7. 命名變量時,使用有描述意義的大寫。簡單變量(例如,int, long, String)應該以小寫字符開始。復雜變量(例如,對象、結構、數組)應該以大寫開始。變量名稱中包含的所有單詞都應該大寫開頭。這會讓讀(寫)代碼的人對所訪問的數據類型有一個清楚的第一印象。
8. 避免在變量名中使用下劃線。絕大多數的編譯器中,它都有非凡的意義。
9. 盡可能(而不是瘋狂的)將代碼模塊化。合理的話,將代碼放入函數中去。這答應更好的代碼重用性和可讀性。
10. 使用正確的循環。假如代碼最少要執行一次,使用do-while循環,否則使用while-do循環。假如確切的循環執行次數已知,使用for循環。
11. 在事件發生的數量超過兩種時,只要可能就使用switch聲明。同時,無論何時只要可能就包含一個switch default(缺省開關),這樣總會有一個選項被觸發。Switch聲明很輕易除錯,而且比組合的多重if聲明執行速度更快。
12. 在您代碼中的邏輯步驟之間加上一個空行(例如,定義變量、循環、等等)。
13. 聲明變量的位置非常重要。變量應該聲明的位置幾乎沒有隨意性。當變量用于整個(類)對象或者必須在對象外可見的時候,變量應放在頭文件中。臨時變量假如不需要在if聲明或循環體外被訪問的話,就應在它們內部聲明。不正確的放置變量聲明會導致執行速度減慢、錯誤、或者引起誤導的代碼。
14. 初始化所有的變量。
15. 假如您有非空返回(帶返回值)的函數,確保所有的退出點都使用了return。對編譯器產生的警告"function should return a value"(函數應該返回一個值)要引起足夠重視。這是嚴重警告并且可能導致您的軟件發生隨機錯誤。
16. 在兩個不同類型的變量間賦值時,應對變量進行強制轉換計算來避免編譯器的警告(例如:int x; float y; … y=float x;)。這么做可以防止"Conversion may loose significant digits"的警告。作為一個程序員您的目標應該盡可能的減少警告的數量。而強制類型轉換將消除其中的大多數。
17. 永遠在刪除后將指針設為NULL。
18. 盡量仔細的調查以避免“閉門造舊車”。經過證實的函數與程序使用時優先于新寫的代碼。這會讓您有更多的時間去寫真實的邏輯代碼并且非常有助于維護。盡管盡管動態鏈表的書寫非常有趣,它早已被完成了!
19. 正確的拼寫很重要。假如拼寫有錯的話,將來的搜索會很困難。
20. 永遠不要使用兩個只有大小寫不同的變量名字。
21. 在您創建代碼時就輸入注解,而不是以后。在您修改代碼的時候,保持對注解的維護。
22. 假如您在調試或除錯時注解(rem)了一段代碼的話,確保您最后將被注解的代碼刪除。
23. 最后最重要的是…保持風格的一致。