模塊化管理和設(shè)計(jì)
在Linux中驅(qū)動(dòng)程序的添加和移除就是典型的模塊化操作,這樣也就方便了基本的操作。這樣通過模塊的注冊(cè)和注銷操作就能夠?qū)崿F(xiàn)模塊的添加。而且在Linux中模塊的注冊(cè)和釋放都是采用同樣的函數(shù)實(shí)現(xiàn)。因此我們可以想象在我們的模塊化設(shè)計(jì)中也可以采用類似的方式實(shí)現(xiàn)。也就是通過統(tǒng)一的注冊(cè)方式。但是具體的模塊操作采用回調(diào)函數(shù)的形式,這與linux驅(qū)動(dòng)中的file_operations結(jié)構(gòu)體具有異曲同工之妙,也就是通過一個(gè)結(jié)構(gòu)體實(shí)現(xiàn)不同的函數(shù)接口,而基本的實(shí)現(xiàn)過程需要我們?cè)谠O(shè)計(jì)驅(qū)動(dòng)的過程中進(jìn)行實(shí)現(xiàn),也就是采用函數(shù)指針的方式進(jìn)行調(diào)用,即實(shí)現(xiàn)回調(diào)。這樣我們就能實(shí)現(xiàn)不同模塊的具體操作。
模塊的管理應(yīng)該包含兩個(gè)過程:注冊(cè)和注銷,同時(shí)注冊(cè)又包括初始化和啟動(dòng),注銷包括停止和撤銷操作。因此可以采用一個(gè)4種狀態(tài)的狀態(tài)圖表示。
但是很多情況下的模塊化存在一定的依賴關(guān)系,這與我們?cè)趯慚akefile中的依賴一樣,需要?jiǎng)?chuàng)建一些其他的模塊才能創(chuàng)建當(dāng)前模塊。為了解決這種問題,我們通常對(duì)模塊進(jìn)行分層設(shè)計(jì)。也就是將存在一定依賴關(guān)系的模塊放在不同的層次上,通過逐層逐層的初始化方式進(jìn)行模塊初始化。這樣就能較好的解決依賴問題。但是有時(shí)候同層也會(huì)存在一定的依賴關(guān)系,這時(shí)我們可以采用分級(jí)的方式解決一定的依賴關(guān)系。因此我們可以將依賴關(guān)系最高的模塊放在最低的層次上,先進(jìn)行初始化,這樣方便其他的模塊對(duì)其進(jìn)行依賴。然后在對(duì)其他的層次初始化。
在實(shí)際的開發(fā)中通常采用不同三層模式,即:平臺(tái)層(這層的模塊對(duì)象先初始化),框架層(第二初始化),應(yīng)用層(最后初始化)。同層的依賴關(guān)系也可以采用分級(jí)(本質(zhì)與分層是相同的)解決。
但是在撤銷的過程中我們需要注意的是,撤銷的順序必須與初始化的順序相反,這也是依賴關(guān)系所導(dǎo)致的,只有先撤銷后初始化的模塊才不會(huì)破壞對(duì)其他模塊的影響。
模塊的管理是模塊化設(shè)計(jì)中非常重要的一環(huán)節(jié),采用回調(diào)函數(shù)的方式能夠很好的解決不同模塊的初始化操作。因此通用的函數(shù)接口也是不斷總結(jié)和分析得到的。
鏈表在模塊化管理中有很重要的作用,記得在Linux中鏈表中不存在內(nèi)容,只是兩個(gè)指針,但是通常將鏈表嵌入到模塊結(jié)構(gòu)體中就能實(shí)現(xiàn)不同模塊的級(jí)聯(lián)。
分層的方式下可以采用鏈表將該層中所有的模塊對(duì)象關(guān)聯(lián)起來,也就是將一個(gè)簡(jiǎn)單的鏈表結(jié)構(gòu)體節(jié)點(diǎn)嵌入到模塊結(jié)構(gòu)體中,通常放在第一個(gè)元素的位置上,這樣就可以通過鏈表指向的地址表示模塊的地址(第一個(gè)元素的地址和結(jié)構(gòu)體的地址是相同的這一原理)。當(dāng)然也可以不放在第一個(gè)元素的位置上,這在 linux源碼中經(jīng)??砂l(fā)現(xiàn)。
- typedef struct list_node
- {
- struct list*prev;
- struct list*next;
- }list_node;
- typedef struct list
- {
- struct list*prev;
- struct list*next;
- intlist_count;
- }list;
- typedefstruct module_object
- {
- list_node _node;
- ....
- }module_object;
模塊和層次的實(shí)現(xiàn)可以采用枚舉型結(jié)構(gòu)事先安排好所有的模塊和所需要的層次,但是最好在其中設(shè)置相應(yīng)的統(tǒng)計(jì)參數(shù),便于參數(shù)的檢查。
比如:
- typedef enum
- {
- /*不同的模塊*/
- module0,
- module1,
- module2,
- ...
- moduleN-1,
- /*統(tǒng)計(jì)模塊的總數(shù)*/
- module_count,
- /*記錄最后的一個(gè)標(biāo)號(hào)*/
- module_last=module_count-1,
- }modules;
- typedef enum
- {
- //platform layer,平臺(tái)層分級(jí)
- PLayer0,
- PLayer1,
- ...
- PLayerM-1,
- //framework layer,框架層分級(jí)
- FLayer0,
- FLayer1,
- ...
- FLayerN-1,
- //application layer,應(yīng)用層分級(jí)
- ALayer0,
- ALayer1,
- ...
- ALayerT-1,
- //統(tǒng)計(jì)層數(shù)
- layer_count,
- layer_last=layer_count-1,
- }Layer;
上面就能實(shí)現(xiàn)分層和模塊的管理,通過下標(biāo)就能訪問具體的層和具體的模塊。當(dāng)然這些都需要我們?cè)趯?shí)際的設(shè)計(jì)中首先規(guī)劃好所有的層次和模塊關(guān)系。
本文引用地址:http://www.ex-cimer.com/article/201612/324501.htm其實(shí)反過來看看linux的模塊化管理真的是做的非常好,因此多去理解linux源碼對(duì)我們的軟件設(shè)計(jì)有很大的提高,重要的是思想。
評(píng)論