½6-7 :盡量不要編寫依賴于其他函數內部實現的函數
說明:此條為函數獨立性的基本要求。由于目前大部分高級語言都是結構化的,所以通過具體語言的語法要求與編譯器功能,基本就可以防止這種情況發生。但在匯編語言中,由于其靈活性,很可能使函數出現這種情況。
示例:如下是在DOS下TASM的匯編程序例子。過程Print_Msg的實現依賴于Input_Msg的具體實現,這種程序是非結構化的,難以維護、修改。
... // 程序代碼
proc Print_Msg // 過程(函數)Print_Msg
... // 程序代碼
jmp LABEL
... // 程序代碼
endp
proc Input_Msg // 過程(函數)Input_Msg
... // 程序代碼
LABEL:
... // 程序代碼
endp
½6-8 :避免設計多參數函數,不使用的參數從接口中去掉
說明:目的減少函數間接口的復雜度。
½6-9 :非調度函數應減少或防止控制參數,盡量只使用數據參數
說明:本建議目的是防止函數間的控制耦合。調度函數是指根據輸入的消息類型或控制命令,來啟動相應的功能實體(即函數或過程),而本身并不完成具體功能?刂茀凳侵父淖兒瘮倒δ苄袨榈膮,即函數要根據此參數來決定具體怎樣工作。非調度函數的控制參數增加了函數間的控制耦合,很可能使函數間的耦合度增大,并使函數的功能不唯一。
示例:如下函數構造不太合理。
int add_sub( int a, int b, unsigned char add_sub_flg )
{
if (add_sub_flg == INTEGER_ADD)
{
return (a + b);
}
else
{
return (a b);
}
}
不如分為如下兩個函數清晰。
int add( int a, int b )
{
return (a + b);
}
int sub( int a, int b )
{
return (a b);
}
½6-10 :檢查函數所有參數輸入的有效性
½6-11 :檢查函數所有非參數輸入的有效性,如數據文件、公共變量等
說明:函數的輸入主要有兩種:一種是參數輸入;另一種是全局變量、數據文件的輸入,即非參數輸入。函數在使用輸入之前,應進行必要的檢查。
½6-12 :函數名應準確描述函數的功能
½6-13 :使用動賓詞組為執行某操作的函數命名。如果是OOP 方法,可以只有動詞(名詞是對象本身)
示例:參照如下方式命名函數。
void print_record( unsigned int rec_ind ) ;
int input_record( void ) ;
unsigned char get_current_color( void ) ;
建議6-14 :避免使用無意義或含義不清的動詞為函數命名
說明:避免用含義不清的動詞如process、handle等為函數命名,因為這些動詞并沒有說明要具體做什么。
建議6-15 :函數的返回值要清楚、明了,讓使用者不容易忽視錯誤情況
說明:函數的每種出錯返回值的意義要清晰、明了、準確,防止使用者誤用、理解錯誤或忽視錯誤返回碼。
½6-16 :除非必要,最好不要把與函數返回值類型不同的變量,以編譯系統默認的轉換方式或強制的轉換方式作為返回值返回
½6-17 :讓函數在調用點顯得易懂、容易理解
½6-18 :在調用函數填寫參數時,應盡量減少沒有必要的默認數據類型轉換或強制數據類型轉換
說明:因為數據類型轉換或多或少存在危險。
½6-19 :避免函數中不必要語句,防止程序中的垃圾代碼
說明:程序中的垃圾代碼不僅占用額外的空間,而且還常常影響程序的功能與性能,很可能給程序的測試、維護等造成不必要的麻煩。
½6-20 :防止把沒有關聯的語句放到一個函數中
說明:防止函數或過程內出現隨機內聚。隨機內聚是指將沒有關聯或關聯很弱的語句放到同一個函數或過程中。隨機內聚給函數或過程的維護、測試及以后的升級等造成了不便,同時也使函數或過程的功能不明確。使用隨機內聚函數,常常容易出現在一種應用場合需要改進此函數,而另一種應用場合又不允許這種改進,從而陷入困境。
在編程時,經常遇到在不同函數中使用相同的代碼,許多開發人員都愿把這些代碼提出來,并構成一個新函數。若這些代碼關聯較大并且是完成一個功能的,那么這種構造是合理的,否則這種構造將產生隨機內聚的函數。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/