¹6-5 :在同一項目組應明確規定對接口函數參數的合法性檢查應由函數的調用者負責還是由接口函數本身負責,缺省是由函數調用者負責
說明:對于模塊間接口函數的參數的合法性檢查這一問題,往往有兩個極端現象,即:要么是調用者和被調用者對參數均不作合法性檢查,結果就遺漏了合法性檢查這一必要的處理過程,造成問題隱患;要么就是調用者和被調用者均對參數進行合法性檢查,這種情況雖不會造成問題,但產生了冗余代碼,降低了效率。
½6-1 :防止將函數的參數作為工作變量
說明:將函數的參數作為工作變量,有可能錯誤地改變參數內容,所以很危險。對必須改變的參數,最好先用局部變量代之,最后再將該局部變量的內容賦給該參數。
示例:下函數的實現不太好。
void sum_data( unsigned int num, int *data, int *sum )
{
unsigned int count;
*sum = 0;
for (count = 0; count < num; count++)
{
*sum += data[count]; // sum成了工作變量,不太好。
}
}
若改為如下,則更好些。
void sum_data( unsigned int num, int *data, int *sum )
{
unsigned int count ;
int sum_temp;
sum_temp = 0;
for (count = 0; count < num; count ++)
{
sum_temp += data[count];
}
*sum = sum_temp;
}
½6-2 :函數的規模盡量限制在200 行以內
說明:不包括注釋和空格行。
½6-3 :一個函數僅完成一件功能
½6-4 :為簡單功能編寫函數
說明:雖然為僅用一兩行就可完成的功能去編函數好象沒有必要,但用函數可使功能明確化,增加程序可讀性,亦可方便維護、測試。
示例:如下語句的功能不很明顯。
value = ( a > b ) ? a : b ;
改為如下就很清晰了。
int max (int a, int b)
{
return ((a > b) ? a : b);
}
value = max (a, b);
或改為如下。
#define MAX (a, b) (((a) > (b)) ? (a) : (b))
value = MAX (a, b);
½6-5 :不要設計多用途面面俱到的函數
說明:多功能集于一身的函數,很可能使函數的理解、測試、維護等變得困難。
½6-6 :函數的功能應該是可以預測的,也就是只要輸入數據相同就應產生同樣的輸出
說明:帶有內部“存儲器”的函數的功能可能是不可預測的,因為它的輸出可能取決于內部存儲器(如某標記)的狀態。這樣的函數既不易于理解又不利于測試和維護。在C/C++語言中,函數的static局部變量是函數的內部存儲器,有可能使函數的功能不可預測,然而,當某函數的返回值為指針類型時,則必須是STATIC的局部變量的地址作為返回值,若為AUTO類,則返回為錯針。
示例:如下函數,其返回值(即功能)是不可預測的。
unsigned int integer_sum( unsigned int base )
{
unsigned int index;
static unsigned int sum = 0; // 注意,是static類型的。
// 若改為auto類型,則函數即變為可預測。
for (index = 1; index <= base; index++)
{
sum += index;
}
return sum;
}
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/