現在的程序設計都希望模塊化,這樣不僅僅能夠實現不同代碼的復用,提高開發速度,同時也減小了在維護過程中的難度。不同的模塊具有不同的功能。這樣也就方便了單獨操作。比如在C語言中函數的設計使得不同的開發人員可以協同合作,而不是從頭到尾一個過程。因此模塊化的設計是非常的必要的。只需要在前期規劃的過程中劃分好最基本的模塊就可以方便后期的設計,當然前期的劃分方式也直接決定后期開發的難度和速度。因此前期的分配過程是體現設計師能力的重點。
在Linux中驅動程序的添加和移除就是典型的模塊化操作,這樣也就方便了基本的操作。這樣通過模塊的注冊和注銷操作就能夠實現模塊的添加。而且在Linux中模塊的注冊和釋放都是采用同樣的函數實現。因此我們可以想象在我們的模塊化設計中也可以采用類似的方式實現。也就是通過統一的注冊方式。但是具體的模塊操作采用回調函數的形式,這與linux驅動中的file_operations結構體具有異曲同工之妙,也就是通過一個結構體實現不同的函數接口,而基本的實現過程需要我們在設計驅動的過程中進行實現,也就是采用函數指針的方式進行調用,即實現回調。這樣我們就能實現不同模塊的具體操作。
模塊的管理應該包含兩個過程:注冊和注銷,同時注冊又包括初始化和啟動,注銷包括停止和撤銷操作。因此可以采用一個4種狀態的狀態圖表示。
但是很多情況下的模塊化存在一定的依賴關系,這與我們在寫Makefile中的依賴一樣,需要創建一些其他的模塊才能創建當前模塊。為了解決這種問題,我們通常對模塊進行分層設計。也就是將存在一定依賴關系的模塊放在不同的層次上,通過逐層逐層的初始化方式進行模塊初始化。這樣就能較好的解決依賴問題。但是有時候同層也會存在一定的依賴關系,這時我們可以采用分級的方式解決一定的依賴關系。因此我們可以將依賴關系最高的模塊放在最低的層次上,先進行初始化,這樣方便其他的模塊對其進行依賴。然后在對其他的層次初始化。
在實際的開發中通常采用不同三層模式,即:平臺層(這層的模塊對象先初始化),框架層(第二初始化),應用層(最后初始化)。同層的依賴關系也可以采用分級(本質與分層是相同的)解決。
但是在撤銷的過程中我們需要注意的是,撤銷的順序必須與初始化的順序相反,這也是依賴關系所導致的,只有先撤銷后初始化的模塊才不會破壞對其他模塊的影響。
模塊的管理是模塊化設計中非常重要的一環節,采用回調函數的方式能夠很好的解決不同模塊的初始化操作。因此通用的函數接口也是不斷總結和分析得到的。
鏈表在模塊化管理中有很重要的作用,記得在Linux中鏈表中不存在內容,只是兩個指針,但是通常將鏈表嵌入到模塊結構體中就能實現不同模塊的級聯。
分層的方式下可以采用鏈表將該層中所有的模塊對象關聯起來,也就是將一個簡單的鏈表結構體節點嵌入到模塊結構體中,通常放在第一個元素的位置上,這樣就可以通過鏈表指向的地址表示模塊的地址(第一個元素的地址和結構體的地址是相同的這一原理)。當然也可以不放在第一個元素的位置上,這在 linux源碼中經常可發現。
- typedef struct list_node
- {
- struct list *prev;
- struct list *next;
- } list_node;
- typedef struct list
- {
- struct list* prev;
- struct list* next;
- int list_count;
- } list;
- typedef struct module_object
- {
- list_node _node;
- ....
- } module_object;
模塊和層次的實現可以采用枚舉型結構事先安排好所有的模塊和所需要的層次,但是最好在其中設置相應的統計參數,便于參數的檢查。
比如:
- typedef enum
- {
- /*不同的模塊*/
- module0,
- module1,
- module2,
- ...
- moduleN-1,
- /*統計模塊的總數*/
- module_count,
- /*記錄最后的一個標號*/
- module_last = module_count -1,
- }modules;
- typedef enum
- {
- //platform layer,平臺層分級
- PLayer0,
- PLayer1,
- ...
- PLayerM-1,
- //framework layer,框架層分級
- FLayer0,
- FLayer1,
- ...
- FLayerN-1,
-
- //application layer,應用層分級
- ALayer0,
- ALayer1,
- ...
- ALayerT-1,
- //統計層數
- layer_count,
- layer_last = layer_count - 1,
- }Layer;
上面就能實現分層和模塊的管理,通過下標就能訪問具體的層和具體的模塊。當然這些都需要我們在實際的設計中首先規劃好所有的層次和模塊關系。
其實反過來看看linux的模塊化管理真的是做的非常好,因此多去理解linux源碼對我們的軟件設計有很大的提高,重要的是思想。