示例:如下函數就是一種隨機內聚。
void Init_Var( void )
{
Rect.length = 0;
Rect.width = 0; /* 初始化矩形的長與寬 */
Point.x = 10;
Point.y = 10; /* 初始化“點”的坐標 */
}
矩形的長、寬與點的坐標基本沒有任何關系,故以上函數是隨機內聚。
應如下分為兩個函數:
void Init_Rect( void )
{
Rect.length = 0;
Rect.width = 0; /* 初始化矩形的長與寬 */
}
void Init_Point( void )
{
Point.x = 10;
Point.y = 10; /* 初始化“點”的坐標 */
}
½6-21 :如果多段代碼重復做同一件事情,那么在函數的劃分上可能存在問題
說明:若此段代碼各語句之間有實質性關聯并且是完成同一件功能的,那么可考慮把此段代碼構造成一個新的函數。
½6-22 :功能不明確較小的函數,特別是僅有一個上級函數調用它時,應考慮把它合并到上級函數中,而不必單獨存在
說明:模塊中函數劃分的過多,一般會使函數間的接口變得復雜。所以過小的函數,特別是扇入很低的或功能不明確的函數,不值得單獨存在。
½6-23 :設計高扇入、合理扇出(小于7 )的函數
說明:扇出是指一個函數直接調用(控制)其它函數的數目,而扇入是指有多少上級函數調用它。
扇出過大,表明函數過分復雜,需要控制和協調過多的下級函數;而扇出過小,如總是1,表明函數的調用層次可能過多,這樣不利程序閱讀和函數結構的分析,并且程序運行時會對系統資源如堆?臻g等造成壓力。函數較合理的扇出(調度函數除外)通常是3-5。扇出太大,一般是由于缺乏中間層次,可適當增加中間層次的函數。扇出太小,可把下級函數進一步分解多個函數,或合并到上級函數中。當然分解或合并函數時,不能改變要實現的功能,也不能違背函數間的獨立性。
扇入越大,表明使用此函數的上級函數越多,這樣的函數使用效率高,但不能違背函數間的獨立性而單純地追求高扇入。公共模塊中的函數及底層函數應該有較高的扇入。
較良好的軟件結構通常是頂層函數的扇出較高,中層函數的扇出較少,而底層函數則扇入到公共模塊中。
½6-24 :減少函數本身或函數間的遞歸調用
說明:遞歸調用特別是函數間的遞歸調用(如A->B->C->A),影響程序的可理解性;遞歸調用一般都占用較多的系統資源(如?臻g);遞歸調用對程序的測試有一定影響。故除非為某些算法或功能的實現方便,應減少沒必要的遞歸調用。
½6-25 :仔細分析模塊的功能及性能需求,并進一步細分,同時若有必要畫出有關數據流圖,據此來進行模塊的函數劃分與組織
說明:函數的劃分與組織是模塊的實現過程中很關鍵的步驟,如何劃分出合理的函數結構,關系到模塊的最終效率和可維護性、可測性等。根據模塊的功能圖或/及數據流圖映射出函數結構是常用方法之一。
½6-26 :改進模塊中函數的結構,降低函數間的耦合度,并提高函數的獨立性以及代碼可讀性、效率和可維護性
優化函數結構時,要遵守以下原則:
(1)不能影響模塊功能的實現。
(2)仔細考查模塊或函數出錯處理及模塊的性能要求并進行完善。
(3)通過分解或合并函數來改進軟件結構。
(4)考查函數的規模,過大的要進行分解。
(5)降低函數間接口的復雜度。
(6)不同層次的函數調用要有較合理的扇入、扇出。
(7)函數功能應可預測。
(8)提高函數內聚。(單一功能的函數內聚最高)
說明:對初步劃分后的函數結構應進行改進、優化,使之更為合理。
½6-27 :在多任務操作系統的環境下編程,要注意函數可重入性的構造
說明:可重入性是指函數可以被多個任務進程調用。在多任務操作系統中,函數是否具有可重入性是非常重要的,因為這是多個進程可以共用此函數的必要條件。另外,編譯器是否提供可重入函數庫,與它所服務的操作系統有關,只有操作系統是多任務時,編譯器才有可能提供可重入函數庫。如DOS下BC和MSC等就不具備可重入函數庫,因為DOS是單用戶單任務操作系統。
½6-28 :避免使用BOOL 參數
說明:原因有二,其一是BOOL參數值無意義,TURE/FALSE的含義是非常模糊的,在調用時很難知道該參數到底傳達的是什么意思;其二是BOOL參數值不利于擴充。還有NULL也是一個無意義的單詞。
½6-29 : 對于提供了返回值的函數,在引用時最好使用其返回值
½6-30 :當一個過程(函數)中對較長變量(一般是結構的成員)有較多引用時,可以用一個意義相當的宏代替
說明:這樣可以增加編程效率和程序的可讀性。
示例:在某過程中較多引用TheReceiveBuffer[FirstSocket].byDataPtr,
則可以通過以下宏定義來代替:
# define pSOCKDATA TheReceiveBuffer[FirstScoket].byDataPtr
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/