跟我學程式設計(3)
很多人做軟體開發非常執著於技術本身,希望通過更少的程式碼解決最多的需求,這個想法本身是沒有錯的,但是應該有一個前提,就是程式碼的可維護性比程式碼的簡潔性重要。
如下面一段程式碼:
void swap(int *x, int *y)
{
*x = *y ^ *x;
*y = *y ^ *y;
*x = *y ^ *y;
}
實現是相當簡潔的,效率也不錯,但是對於一個沒有這個概念的其他程式設計師來維護這個系統時候,就需要花時間去演算一下這個過程實現了什麼。如果採用如下的程式邏輯,則相對來說容易理解得多。
void swap_int( int *x, int *y)
{
int temp_int;
temp_int = *x;
*x = *y;
*y = temp_int;
}
在這裡我們在函式名swap之後加上了_int,一方面可以讓其他程式設計師更好理解函式的意義,同時也可以在一個程式用構建如swap_byte、swap_long這些函式,而不至於引起混淆。
下面是摘錄一個程式設計師編寫的一個函式,說明似乎是很規範,但是這樣千篇一律的只為了構建索引而編制的函式說明有什麼意義呢,它並不會為其他程式設計師提供更多的資訊。還有一個問題,函式名,這個簡直就是精簡啊,但是當他過一段時間再去閱讀自己的程式的時候,一樣會被弄糊塗的。
/*******************************************
函式名稱: InB
功 能: 從D12讀出一個位元組資料
參 數: 無
返回值 : dat--讀出的位元組資料
/********************************************/
uchar InB(void)
{
.......
}
1) 在函式說明中,可以說明該函式的程式邏輯、用途、限制等資訊。
2) 函式名應該儘可能地長,而不是儘可能短, 如Read_OneByte_From_D12。
下面看兩個程式的可讀性區別
if(BUSY)
WAIT;
else
SendCmd(RESET);
上面的程式相當簡單,下面的程式顯得更囉嗦些。
if (D12_IS_BUSY )
WAIT_UNTIL_D12_FREE;
ELSE
Send_Command_To_D12(COMMAND_RESET_D12);
第二段程式的可閱讀性明顯增強,從程式碼中變數和函式名稱就可以獲知程式的適用範圍。
雖然書寫第二段程式碼需要的時間比第一段稍微長些,但是書寫時間在整個編寫程式中佔用的時間可以說是微乎其微的。千萬不要為了少敲幾個字而讓程式的閱讀性下降。
剛學寫程式的時候,有一個天真的概念,就是變數定義太長,會佔用更多的程式空間,為了減少軟體的尺寸,儘量縮短變數函式名稱。後來對於資料的儲存和編譯有些概念之後才知道,原來無論變數和函式名定義多長,編譯後的程式都是佔用一樣的儲存空間。