軟件模塊化的設(shè)計原則
軟件模塊化的設(shè)計通常用聚合(聚合是對模塊功能相對強度的度量)和禍合(禍合是對一個軟件結(jié)構(gòu)內(nèi)不同模塊之間互相關(guān)聯(lián)程度的度量)的概念來衡量模塊間的獨立性和模塊間的關(guān)聯(lián)性。在設(shè)計模塊時,我們將遵循如下的軟件
軟件模塊化的設(shè)計通常用聚合(聚合是對模塊功能相對強度的度量)和禍合(禍合是對一個軟件結(jié)構(gòu)內(nèi)不同模塊之間互相關(guān)聯(lián)程度的度量)的概念來衡量模塊間的獨立性和模塊間的關(guān)聯(lián)性。在設(shè)計模塊時,我們將遵循如下的軟件模塊化設(shè)計的原則。
1、高聚合
設(shè)計時應(yīng)該力求做到模塊的高聚合(順序聚合、功能聚合),通常中等程度的聚合(過程聚合、通信聚合)也是可以采用的,而且效果和高聚合相差不多。但是,低聚合(偶然聚合、邏輯聚合、時間聚合)效果很差,一般都不采用。
2、降低接口復(fù)雜性
在禍合方式上力求降低模塊間接口的復(fù)雜性。模塊間接口的復(fù)雜性包括模塊的接口方式、接口信息的結(jié)構(gòu)和數(shù)量。接口方式不采用直接引入(內(nèi)容禍合),而采用調(diào)用方式(如過程語句調(diào)用方式)。接口信息通過參數(shù)傳遞且傳遞信息的結(jié)構(gòu)盡量簡單,不用復(fù)雜參數(shù)結(jié)構(gòu)(如過程、指針等類型參數(shù)),參數(shù)的個數(shù)也不宜太多,如果太多,則說明模塊的功能過于龐大復(fù)雜,可考慮降低其復(fù)雜性。
3、改進軟件結(jié)構(gòu)
盡可能改進軟件結(jié)構(gòu)提高模塊獨立性。設(shè)計出軟件的初步結(jié)構(gòu)以后,應(yīng)審查分析這個結(jié)構(gòu),通過模塊分解或合并,力求降低禍合提高聚合。如圖2.5所示,若其中B、C、D之間存在內(nèi)容禍合,可將它們合并為一個模塊BCD,若E、F中有一個公共的子功能,可將該子功能獨立成一個模塊,這樣就可以改進結(jié)構(gòu)。
4、減少高扇出結(jié)構(gòu)
盡量減少高扇出結(jié)構(gòu),特別當深度增加時,力求扇入,避免軟件的瀑布式結(jié)構(gòu)。深度表示軟件結(jié)構(gòu)中控制的層數(shù),扇出是對某一模塊直接控制的模塊數(shù)目的度量,扇入則是對某一給定模塊被多少個模塊直接控制的度量。扇出過大意味著模塊越復(fù)雜,需要控制和協(xié)調(diào)過多的下級模塊,扇出過小也不好。經(jīng)驗表明,一個設(shè)計得好的典型系統(tǒng)的平均扇出通常是3或4(扇出的上限通常是5~9)。一個模塊的扇入表明有多少個上級模塊直接調(diào)用它,扇入越大則共享該模塊的上級模塊數(shù)目越多,扇入的目的在于提高公共的實用模塊的利用率,防止設(shè)計冗余。
5、保持模塊作用域與控制域一致
將模塊的作用域保持在其控制域內(nèi)。模塊的作用域定義為受該模塊內(nèi)一個判定影響的所有模塊的集合。模塊的控制域是這個模塊本身及所有直接或間接從屬于它的模塊的集合。為減少模塊間的禍合度,應(yīng)只在有調(diào)用控制關(guān)系的模塊間存在控制禍合。若模塊的作用域與控制域不一致,則說明存在另一個模塊,與該模塊無調(diào)用控制關(guān)系,但兩者具有控制禍合,這樣的結(jié)構(gòu)使得軟件難于理解、軟件測試與軟件維護。
6、可預(yù)測的模塊功能
模塊功能應(yīng)該可以預(yù)測。如果將一個模塊看作黑盒子,就是說,只要輸入的數(shù)據(jù)相同就產(chǎn)生同樣的輸出,這個模塊的功能就是可以預(yù)測的。具有內(nèi)部狀態(tài)的模塊,其輸出不僅與輸入有關(guān),而且還取決于模塊的當前狀態(tài),其功能是不可預(yù)測的,這就增加了模塊的測試和維護難度。對于這種不可避免的情況,要引起充分注意,要將相應(yīng)模塊做特殊處理。無論測試還是維護都把模塊狀態(tài)作為一個重要影響因素來考慮。
7、單入口單出口的模塊
設(shè)計單入口單出口的模塊。這條規(guī)則警告軟件開發(fā)者不要使模塊間出現(xiàn)內(nèi)容禍合,這也是結(jié)構(gòu)化程序設(shè)計的基本要求,目的在于提高軟件的可理解性、可測試性和可維護性。