模塊與接口規(guī)范_第1頁
模塊與接口規(guī)范_第2頁
模塊與接口規(guī)范_第3頁
模塊與接口規(guī)范_第4頁
模塊與接口規(guī)范_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、模塊與接口規(guī)范模塊與接口規(guī)范模塊及模塊接口設(shè)計原則一.何為模塊 模塊由接口和實現(xiàn)兩部分組成。 -接口指明模塊的功能,即模塊能做什么。它聲明了使用該模塊代碼的標(biāo)識符,類型和函數(shù)原型等; -實現(xiàn)指模塊是如何完成起接口聲明的功能。一個具體的功能模塊接口是唯一固定的,但是它的實現(xiàn)可能會有很多種。每個實現(xiàn)可能使用不同的算法和數(shù)據(jù)結(jié)構(gòu),但是都必須符合接口給出的使用聲明。M1M2M6M3M4M5二二. . 模塊劃分基本準(zhǔn)則模塊劃分基本準(zhǔn)則模塊的劃分以功能為標(biāo)準(zhǔn),相對獨立的功能劃分為不同的模塊,各模塊之間根據(jù)需要可以進(jìn)行數(shù)據(jù)通信,但是必須保持功能上的相對獨立性。 “功能獨立”的模塊可以降低開發(fā)、測試、維護(hù)等階

2、段的代價。但是“功能獨立”并不意味著模塊之間保持絕對的孤立。一個系統(tǒng)要完成某項任務(wù),需要各個模塊相互配合才能實現(xiàn),此時模塊之間就要進(jìn)行信息交流。 從功能上劃分模塊,保持“功能獨立”是模塊化設(shè)計的基本原則。三. 模塊與接口設(shè)計準(zhǔn)則 接口是對模塊功能的聲明,只需要指明客戶調(diào)用程序可能使用的標(biāo)識符(包括數(shù)據(jù)類型,函數(shù)原型等)即可,應(yīng)盡可能隱藏內(nèi)部細(xì)節(jié)和算法。 1封裝與隱藏封裝與隱藏applicationM1 tinterface1M2Mn聲明與實現(xiàn)分離 2模塊的獨立性模塊的獨立性 為了保證模塊的獨立封裝性,就必須將聲明與實現(xiàn)分離開來。C語言對此只提供最基本的支持。在標(biāo)準(zhǔn)C語言中,接口在頭文件中聲明,

3、頭文件的擴(kuò)展名為.h。 由于標(biāo)準(zhǔn)C語言沒有提供命名空間機(jī)制,較大規(guī)模軟件中,不同模塊的全局變量和函數(shù)也很可能重名,導(dǎo)致重復(fù)定義錯誤。同時被多個模塊使用的全局變量,是增大模塊間耦合性的重要因素之一,為減少模塊間耦合性,應(yīng)盡量少用或不用多個模塊共用的全局變量。內(nèi)聚是一個模塊內(nèi)部各成分之間相關(guān)聯(lián)程度的度量。根據(jù)內(nèi)聚性的強(qiáng)弱,有以下幾種類型: 3強(qiáng)內(nèi)聚性強(qiáng)內(nèi)聚性 (1)隨機(jī)內(nèi)聚: 如果一個模塊的各成分之間毫無關(guān)系,則稱為隨機(jī)內(nèi)聚。 (2)邏輯內(nèi)聚: 幾個邏輯上相關(guān)的功能被放在同一模塊中,則稱為邏輯內(nèi)聚。如一個模塊讀取各種不同類型外設(shè)的輸入。盡管邏輯內(nèi)聚比偶然內(nèi)聚合理一些,但邏輯內(nèi)聚的模塊各成分在功能上

4、并無關(guān)系,即使局部功能的修改有時也會影響全局,因此這類模塊的修改也比較困難。 (3)時間內(nèi)聚: 如果一個模塊完成的功能必須在同一時間內(nèi)執(zhí)行(如系統(tǒng)初始化),但這些功能只是因為時間因素關(guān)聯(lián)在一起,則稱為時間內(nèi)聚。 (4)過程內(nèi)聚: 如果一個模塊內(nèi)部的處理成分是相關(guān)的,而且這些處理必須以特定的次序執(zhí)行,則稱為過程內(nèi)聚。 (5)通信內(nèi)聚: 如果一個模塊的所有成分都操作同一數(shù)據(jù)集或生成同一數(shù)據(jù)集,則稱為通信內(nèi)聚。 (6)順序內(nèi)聚: 如果一個模塊的各個成分和同一個功能密切相關(guān),而且一個成分的輸出作為另一個成分的輸入,則稱為順序內(nèi)聚。 (7)功能內(nèi)聚: 模塊的所有成分對于完成單一的功能都是必須的,則稱為功

5、能內(nèi)聚。 m1m4m3m5m6m2Interface nMn防止把沒有關(guān)聯(lián)的功能放到一個模塊中。 3.1. 設(shè)計高內(nèi)聚性模塊設(shè)計高內(nèi)聚性模塊 防止函數(shù)或模塊內(nèi)出現(xiàn)隨機(jī)內(nèi)聚。在編程時,經(jīng)常遇到在不同函數(shù)中使用相同的代碼,許多開發(fā)人員都會把這些代碼提出來,并構(gòu)成一個新函數(shù)。若這些代碼關(guān)聯(lián)較大并且是完成一個功能的,那么這種構(gòu)造是合理的,否則這種構(gòu)造將產(chǎn)生隨機(jī)內(nèi)聚的函數(shù)。 例如:例如:很多軟件系統(tǒng)在啟動的時候都需要初始化一些參數(shù),因此不少系統(tǒng)會把初始化模塊做成一個或多個函數(shù)。但是要防止把毫不相關(guān)的參數(shù)初始化放入同一個函數(shù)。int init_env()init_graphics.;/初始化圖形設(shè)置ini

6、t_language.;/初始化語言設(shè)置init_connect.;/初始化網(wǎng)絡(luò)連接. 假如模塊A需要使用a語言,無網(wǎng)絡(luò)連接,而模塊B需要使用b語言,有網(wǎng)絡(luò)連接。則init_env函數(shù)無論怎么改動都無法同時滿足兩個模塊要求。此時函數(shù)init_env就是隨機(jī)內(nèi)聚函數(shù),正確的修改方法應(yīng)該是根據(jù)初始化的模塊不同,分解成相對獨立的函數(shù)。修改init_env()為三個獨立的函數(shù):int init_graphics();int init_language();int init_connect();這樣不同的功能模塊,可以根據(jù)自己的需要調(diào)用不同的初始化模塊。 函數(shù)的功能要單一,不要設(shè)計“多功能”函數(shù)。 函數(shù)

7、的功能應(yīng)該是單一而明確的。不要把不同的功能放入同一個函數(shù),特別是盡量不要用控制開關(guān)來讓數(shù)據(jù)處理函數(shù)實現(xiàn)不同的功能。#define TYPE_ADD0#define TYPE_SUB1int add_or_sub(int a, int b, int flag)if (TYPE_ADD = flag)return (a + b);elsereturn (a b);例如:如下是不好的函數(shù)設(shè)計,函數(shù)功能不單一,且實現(xiàn)的功能無必然聯(lián)系。 耦合(Coupling) 是模塊之間依賴程度的度量。內(nèi)聚和耦合是密切相關(guān)的,與其它模塊存在強(qiáng)耦合的模塊通常意味著弱內(nèi)聚,而強(qiáng)內(nèi)聚的模塊通常意味著與其它模塊之間存在弱耦合

8、。模塊設(shè)計追求強(qiáng)內(nèi)聚,弱耦合。4弱耦合性弱耦合性耦合的強(qiáng)度依賴于以下幾個因素:(1)一個模塊對另一個模塊的調(diào)用;(2)一個模塊向另一個模塊傳遞的數(shù)據(jù)量;(3)一個模塊施加到另一個模塊的控制的多少;(4)模塊之間接口的復(fù)雜程度。 耦合按從強(qiáng)到弱的順序可分為以下幾種類型: (1)內(nèi)容耦合: 當(dāng)一個模塊直接修改或操作另一個模塊的數(shù)據(jù),或者直接轉(zhuǎn)入另一個模塊 時,就發(fā)生了內(nèi)容耦合。此時,被修改的模塊完全依賴于修改它的模塊。 (2)公共耦合: 兩個以上的模塊共同引用一個全局?jǐn)?shù)據(jù)項就稱為公共耦合。 (3)控制耦合: 一個模塊在界面上傳遞一個信號(如開關(guān)值、標(biāo)志量等)控制另一個模 塊,接收信號的模塊的動作根

9、據(jù)信號值進(jìn)行調(diào)整,稱為控制耦合。 (4)標(biāo)記耦合: 模塊間通過參數(shù)傳遞復(fù)雜的內(nèi)部數(shù)據(jù)結(jié)構(gòu),稱為標(biāo)記耦合。此數(shù)據(jù)結(jié)構(gòu) 的變化將使相關(guān)的模塊發(fā)生變化。 (5)數(shù)據(jù)耦合: 模塊間通過參數(shù)傳遞基本類型的數(shù)據(jù),稱為數(shù)據(jù)耦合。 (6)非直接耦合: 模塊間沒有信息傳遞時,屬于非直接耦合。減少多個模塊間的全局變量 4.1. 設(shè)計弱耦合性模塊設(shè)計弱耦合性模塊 多個模塊間都能使用的全局變量會增大模塊間耦合,給程序的調(diào)試和維護(hù)帶來很大的不便。盡量采用參數(shù)傳遞來取代多個模塊間的全局變量。注意:使用static修飾的模塊內(nèi)全局變量不會增加模塊間耦合,在參數(shù)傳遞極為頻繁的情況下,可以將需要頻繁傳遞的參數(shù)提取為模塊內(nèi)部全局

10、變量,以減少函數(shù)參數(shù)個數(shù)和參數(shù)傳遞。多個模塊間如果存在全局變量,盡量讓該全局變量只被一個模塊修改,而其它模塊只讀。減少模塊間接口復(fù)雜度,函數(shù)參數(shù)不得超過7個。 復(fù)雜的函數(shù)接口,既不便于使用,也會增加調(diào)用時的出錯幾率。如果函數(shù)功能復(fù)雜,參數(shù)過多,可以考慮分解成幾個函數(shù)來完成,或?qū)⒂羞壿嬯P(guān)聯(lián)的參數(shù)構(gòu)建成結(jié)構(gòu)體來傳遞參數(shù)。 減少模塊間控制參數(shù),模塊通信盡量只使用數(shù)據(jù)通信。 模塊控制參數(shù)是指,某個模塊的功能,部分或完全取決于另一模塊傳遞過來的參數(shù)??刂茀?shù)會增大模塊耦合,使得模塊不便于理解和調(diào)試,應(yīng)盡量避免。 extern int control_param_from_B;/控制參數(shù),從B模塊傳遞而來

11、some code;if (control_param_from_B = xxx)/根據(jù)傳遞過來的參數(shù)決定功能。do something;elsedo other thing;如果模塊間需要進(jìn)行數(shù)據(jù)通信,盡量采用文本形式的簡單數(shù)據(jù)格式。不要定義復(fù)雜二進(jìn)制數(shù)據(jù)格式,除非文本格式無法滿足功能要求。 不少模塊間需要進(jìn)行數(shù)據(jù)通信,通信數(shù)據(jù)格式盡量采用簡單文本形式。二進(jìn)制通信格式既不便于使用,也不便于調(diào)試,不建議使用。 數(shù)據(jù)格式應(yīng)盡可能簡單,且必須能滿足可擴(kuò)充性。 采用簡單格式的文本數(shù)據(jù)通信,也有助于減少模塊間耦合。一般來說,二進(jìn)制通信協(xié)議如果數(shù)據(jù)格式發(fā)生變化,則通信的各個模塊編解碼都需要相應(yīng)變化。而文

12、本通信能保持較好的兼容性。 二進(jìn)制編碼一般情況下能提高時間和空間效率,當(dāng)需要傳遞大量數(shù)據(jù)且對性能要求較高,或必須傳遞二進(jìn)制數(shù)據(jù)時,才可以考慮二進(jìn)制編碼協(xié)議。普通情況下,二進(jìn)制編碼帶來的效率提升甚至無法抵消編解碼帶來的額外開銷。如果一個模塊可以被擴(kuò)充,則稱模塊具有可擴(kuò)充性。當(dāng)著手一個新模塊時,很難一次性解決所有問題,應(yīng)該先縱觀問題的一些重要方面,同時作好以后補(bǔ)充的準(zhǔn)備。5.可復(fù)用性與可擴(kuò)充性可復(fù)用性與可擴(kuò)充性 5.1. 模塊設(shè)計過程中,數(shù)據(jù)結(jié)構(gòu)需適當(dāng)考慮可擴(kuò)充性。模塊設(shè)計過程中,數(shù)據(jù)結(jié)構(gòu)需適當(dāng)考慮可擴(kuò)充性。 例如:結(jié)構(gòu)體可以設(shè)置保留字段,為以后的升級或功能擴(kuò)展做預(yù)留空間。 IP數(shù)據(jù)報格式及首部中

13、的各字段5.2函數(shù)的設(shè)計,如果相關(guān)聯(lián)的參數(shù)較多,可以合并為結(jié)構(gòu)體。函數(shù)的設(shè)計,如果相關(guān)聯(lián)的參數(shù)較多,可以合并為結(jié)構(gòu)體。 結(jié)構(gòu)體是C語言實現(xiàn)面向?qū)ο蟮年P(guān)鍵之一,可以很好的體現(xiàn)面向?qū)ο笏枷?。同時能給功能升級和擴(kuò)充帶來很大的方便。 例如: 假如某函數(shù)對一個數(shù)據(jù)結(jié)構(gòu)進(jìn)行處理,可以定義為以下形式: func_name(int option1, int option2, char option3, char *option4) 也可以將四個數(shù)據(jù)項定義為一個結(jié)構(gòu)體,函數(shù)采用結(jié)構(gòu)體做參數(shù)typedef structint option1;int option2;char *option4;char optio

14、n3;OPTION, *P_OPTION;func_name(P_OPTION p_option); 假如由于功能升級,需要增加一個功能選項,第一種方案除了修改函數(shù)本身,還不得不修改每個函數(shù)調(diào)用。而第二種方案僅僅需要修改函數(shù)本身和結(jié)構(gòu)體的聲明。 5.3. 設(shè)計和編碼的過程中,要有復(fù)用性設(shè)計和模塊化的思維。設(shè)計和編碼的過程中,要有復(fù)用性設(shè)計和模塊化的思維。 復(fù)用性設(shè)計,模塊化思維就是要程序員在完成任何一個功能模塊或函數(shù)的時候,要多深入考慮,不要局限在完成當(dāng)前任務(wù)的簡單思路上,想想看該模塊或函數(shù)是否可以脫離這個系統(tǒng)存在,是否可以通過簡單的修改參數(shù)的方式在其他系統(tǒng)和應(yīng)用環(huán)境下直接引用,這樣就能極大避

15、免重復(fù)性的開發(fā)工作. 如果一個軟件研發(fā)單位和工作組能夠在每一次研發(fā)過程中都考慮到這些問題,那么程序員就不會在重復(fù)性的工作中耽誤太多時間,就會有更多時間和精力投入到創(chuàng)新的代碼工作中去。對于軟件公司,也無需重復(fù)開發(fā)同樣的功能,避免“重復(fù)設(shè)計輪子”。 lib_serial.htypedef struct unsigned charbaud_rate; / 波特率 unsigned chardata_len; / 數(shù)據(jù)位 unsigned charparity_bit; / 校驗位 unsigned charstop_bit; / 停止位 . /其它屬性COM_OPTION, *P_COM_OPTIO

16、N;/*使用指定屬性打開串口*/int open_serial(P_COM_OPTION p_com_option);/*設(shè)置串口波特率*/int set_serial_baud_speed(int baud_speed, int serial_fd);.例如: 在公司很多產(chǎn)品中,都有使用串口通信的功能模塊。但是雖然已有多個項目使用了串口通信,卻沒有形成串口通信庫。每次打開串口,發(fā)送數(shù)據(jù)等,都是重新編寫函數(shù),或拷貝代碼后做大量修改,可重用性很低。 應(yīng)該將串口屬性定義為結(jié)構(gòu)體,針對結(jié)構(gòu)體將串口的常用操作如打開串口,設(shè)置波特率,收發(fā)數(shù)據(jù)等做成庫函數(shù),函數(shù)在頭文件中聲明,并編譯成動態(tài)或靜態(tài)庫。以后的

17、項目中只需直接包含頭文件并鏈接相關(guān)庫即可。 模塊功能的完善化6. 軟件模塊結(jié)構(gòu)的改進(jìn)軟件模塊結(jié)構(gòu)的改進(jìn)一個完整的模塊應(yīng)當(dāng)有以下幾部分: 執(zhí)行規(guī)定的功能的部分; 出錯處理的部分。當(dāng)模塊不能完成規(guī)定的功能時,必須回送出錯標(biāo)志,出現(xiàn)例外情況的原因。 如果需要返回一系列數(shù)據(jù)給它的調(diào)用者,在完成數(shù)據(jù)加工或結(jié)束時, 應(yīng)當(dāng)給它的調(diào)用者返回一 個結(jié)束狀態(tài)標(biāo)志。 消除重復(fù)功能,改善軟件結(jié)構(gòu)1 完全相似:在結(jié)構(gòu)上完全相似,可能只是在數(shù)據(jù)類型上不一致。此時可以采取完全合并的方法。2 局部相似:找出其相同部分,分離出去,重新定義成一個獨立的下一層模塊。還可以與它的上 級模塊合并。3 模塊的作用范圍應(yīng)在控制范圍之內(nèi) 模

18、塊的控制范圍包括它本身及其所有的從屬模塊。 模塊的作用范圍是指模塊內(nèi)一個判定的作用范圍,凡是受這個判定影響的所有模塊都屬于這個判 定的作用范圍。 如果一個判定的作用范圍包含在這個判定所在模塊的控制范圍之內(nèi),則這種結(jié)構(gòu)是簡單的,否 則,它的結(jié)構(gòu)是不簡單的。 4 盡可能減少高扇出結(jié)構(gòu),隨著深度增大扇入 如果一個模塊的扇出數(shù)過大,就意味著該模塊過分復(fù)雜,需要協(xié)調(diào)和控制過多的下屬模塊。應(yīng) 當(dāng)適當(dāng)增加中間層次的控制模塊。 避免或減少使用病態(tài)聯(lián)接避免或減少使用病態(tài)聯(lián)接 直接病態(tài)聯(lián)接 即模塊A直接從模塊B內(nèi)部取出某些數(shù)據(jù),或者把某些數(shù)據(jù)直接送到模塊B內(nèi)部。 公共數(shù)據(jù)域病態(tài)聯(lián)接 模塊A和模塊B通過公共數(shù)據(jù)域,

19、直接傳送或接受數(shù)據(jù),而不是通過它們的上級模塊。這種方式將使得模塊間的耦合程度劇增。它不僅影響模塊和模塊,而且影響與公共數(shù)據(jù)域有關(guān)聯(lián)的所有模塊。 通信模塊聯(lián)接 即模塊A和模塊B通過通信模塊TABLEIT傳送數(shù)據(jù)。從表面看,這不是病態(tài)聯(lián)接,因為模塊和模塊B都未涉及通信模塊TABLEIT 的內(nèi)部。然而,它們之間的通信(即數(shù)據(jù)傳送)沒有通過它們的上級模塊。從這個意義上講,這種聯(lián)接是病態(tài)的。模塊的大小要適中設(shè)計功能可預(yù)測的模塊,但要避免過分受限制的模塊 一個功能可預(yù)測的模塊,不論內(nèi)部處理細(xì)節(jié)如何,但對相同的輸入數(shù)據(jù),總能產(chǎn)生同樣的結(jié)果。但是,如果模塊內(nèi)部蘊(yùn)藏有一些特殊的鮮為人知的功能時,這個模塊就可能是

20、不可預(yù)測的。對于這種模塊,如果調(diào)用者不小心使用,其結(jié)果將不可預(yù)測。 為了能夠適應(yīng)將來的變更,軟件模塊中局部數(shù)據(jù)結(jié)構(gòu)的大小應(yīng)當(dāng)是可控制的,控制流的選擇對于調(diào)用者來說,應(yīng)當(dāng)是可預(yù)測的。而與外界的接口應(yīng)當(dāng)是靈活的。 軟件包應(yīng)滿足設(shè)計約束和可移植性,為了使得軟件包可以在某些特定的環(huán)境下能夠安裝和運(yùn)行,對軟件包提出了一些設(shè)計約束和可移植的要求。 模塊的大小要適中 模塊的大小,可以用模塊中所含語句的數(shù)量的多少來衡量。把模塊的大小限制在一定的范圍之內(nèi)。通常規(guī)定其語句行數(shù)在50100左右,保持在一頁紙之內(nèi),最多不超過500行。 模塊的效率,從根本上取決于實現(xiàn)的算法和數(shù)據(jù)結(jié)構(gòu)。 7.時間與空間效率時間與空間效率

21、 數(shù)據(jù)結(jié)構(gòu) 與 算法 就是一類數(shù)據(jù)的表示及其相關(guān)的操作。從數(shù)據(jù)表示的觀點來看,存儲在數(shù)組中的一個有序整數(shù)表也是一種數(shù)據(jù)結(jié)構(gòu)。算法是指對數(shù)據(jù)結(jié)構(gòu)施加的一些操作。 (1)每一種數(shù)據(jù)結(jié)構(gòu)與算法都有其時間、空間的開銷和收益。當(dāng)面臨一個 新的設(shè)計問題時,設(shè)計者要徹底地掌握怎樣權(quán)衡時空開銷和算法有效 性的方法。這就需要懂得算法分析的原理,而且還需要了解所使用的 物理介質(zhì)的特性(例如,數(shù)據(jù)存儲在磁盤上與存儲在內(nèi)存中,就有不 同的考慮)。 (2)與開銷和收益有關(guān)的是時間空間的權(quán)衡。通常可以用更大的時間 開銷來換取空間的收益,反之亦然。(3)程序員應(yīng)該充分地了解一些常用的數(shù)據(jù)結(jié)構(gòu)與算法,避免不必要的重 復(fù)設(shè)計工作。 (4)數(shù)據(jù)結(jié)構(gòu)與算法為應(yīng)用服務(wù)。我們必須先了解應(yīng)用的需求,再尋找或 設(shè)計與實際應(yīng)用相匹配的數(shù)據(jù)結(jié)構(gòu)。 根據(jù)模塊的輸入輸出依賴程度,構(gòu)建不同抽象層次。 8. 健壯性與容錯性健壯性與容錯性 模塊的輸出依賴性越強(qiáng)(較多的其它模塊功能,依賴本模塊輸出結(jié)果或控制信號),則其它模塊越

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論