现在的程序规划都期望模块化,这样不仅仅能够完成不同代码的复用,进步开发速度,一起也减小了在保护进程中的难度。不同的模块具有不同的功用。这样也就便利了独自操作。比方在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;
- intlist_count;
- }list;
- typedefstruct 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源码对咱们的软件规划有很大的进步,重要的是思维。