程序设计模块化设计思想详解.docx
- 文档编号:9433503
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:21
- 大小:21.23KB
程序设计模块化设计思想详解.docx
《程序设计模块化设计思想详解.docx》由会员分享,可在线阅读,更多相关《程序设计模块化设计思想详解.docx(21页珍藏版)》请在冰豆网上搜索。
程序设计模块化设计思想详解
机顶盒开发教程
程序模块化结构设计
版本:
0
编写:
技术开发部软件2科
版本历史
版本号
日期
作者
更新内容
2011/3/24
倪海涛
建立文档,完成第一版。
模块化程序设计
一、模块化设计目的
模块化产品设计的目的是以少变应多变,以尽可能少的投入生产尽可能多的产品,以最为经济的方法满足各种要求。
二、名词解释
模块(Block-based):
在程序设计中,为完成某一功能所需的一段程序或子程序;或指能由编译程序、装配程序等处理的独立程序单位;或指大型软件系统的一部分。
模块化程序设计(Block-baseddesign):
是对一定范围内的不同功能或相同功能不同平台、不同规格的产品进行功能分析的基础上,划分并设计出一系列功能模块,通过模块的选择和组合构成不同的顾客定制的程序,以满足市场的不同需求。
三、模块化具体思路
从目前机顶盒产品的发展来看,机顶盒产品方案繁多,并且各家机顶盒方案在开发应用功能程序部分时,程序设计思路不一样,导致开发同一个功能,在不同的方案上都要从新做一遍,耗时费力,但是不一定效果都好。
对于以应用开发为主的公司,这样的重复设计就相当的严重。
为提高开发效率和开发质量,我们必须要做的一件事情就是统一设计功能模块,将其与系统平台剥离,形成一套统一的应用层模块势在必行。
要将平台与应用进行剥离,最关键的一点就是明确平台与应用的接口,将接口形成一种标准。
在这种标准接口的规范下,无论平台系统如何变化,应用模块都能无差异化的重复使用,既提高了开发效率,又可以在不断的应用中,针对性的不断提高开发质量。
模块化程序设计的重点就是程序接口的标准化。
四、基础知识
指针为模块化设计最关键的知识点。
指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)。
指针可以用来有效地表示复杂的数据结构,可以用于函数参数传递并达到更加灵活使用函数的目的。
使C语言程序的设计具有灵活、实用、高效的特点。
五、设计流程
程序设计模块化示意图:
系统注册功能模块
应用与功能模块之间的接口
功能实现
系统调用接口
系统注销功能模块
模块化应用三部曲:
第一步:
注册模块;
第二步:
调用模块功能;
第三部:
注销模块;
模块化设计三部曲:
第一步:
实现模块功能;
第二步:
完成应用与功能模块接口之间的对接;
第三步:
应用根据需要调用中间接口;
六、具体设计
5.1实现模块化管理框架
数据结构
模块公共数据结构:
structmodule_com_interface{
UINT32type;/*模块类型(前16位)&&同类型模块ID(后16位)*/
INT8*module_name;/*模块名字*/
structmodule_com_interface*next;/*指向下一个模块结构,用于模块管理*/
};
Demo模块数据结构:
structmodule_demo_interface{
UINT32type;/*模块类型(前16位)&&同类型模块ID(后16位)*/
INT8*module_name;/*模块名字*/
structmodule_demo_interface*next;/*指向下一个模块结构,用于模块管理*/
/*模块私有数据结构*/
void*priv;/*私有数据指针*/
/*Demo模块功能函数*/
INT32(*init)();/*Demo模块初始化*/
INT32(*io_ctl)(structmodule_demo_interface*module,INT32cmd,UINT32param);/*Demo模块功能控制*/
};
模块公共数据结构成员,是每一个实体Demo模块数据结构所必须的;在公共模块的基础上,实体Demo模块数据结构可根据模块的需求,扩展结构体成员,以满足自己的需要。
staticstructmodule_com_interface*module_com_base=NULL;
module_com_base为管理模块链表的一个基础头指针,用于管理所有模块链表使用。
5.1.2系统管理模块函数:
定义:
#defineMODULE_TYPE_MASK0xFFFF0000/*模块类型掩码*/
#defineMODULE_ID_MASK0x0000FFFF/*模块ID掩码*/
声明:
void*module_get_by_name(char*name);/*通过名字查找模块*/
void*module_get_by_type(UINT32type,UINT16id);/*通过类型查找模块*/
INT32module_malloc(UINT32type,char*name,UINT32size);/*分配模块空间,并将模块添加入模块链表*/
INT32module_free(structmodule_demo_interface*module);/*释放模块空间,并将模块从模块链表删除*/
实现:
/*分配模块空间,并将模块添加入模块链表*/
INT32module_malloc(UINT32type,char*name,UINT32size)
{
UINT16id;
structmodule_com_interface*module=(structmodule_com_interface*)malloc(size);
structmodule_com_interface*pmodule;
if(module==NULL)
{
MODULE_PRINTF("module_malloc:
error-device%snotenoughmemory:
%08x!
\n",name,size);
returnNULL;
}
/*在模块列表中找出相同name的模块*/
for(id=0,pmodule=module_com_base;pmodule!
=NULL;pmodule=pmodule->next)
{
/*Findthemodule*/
if(strcmp(pmodule->name,name)==0)
{
MODULE_PRINTF("module_malloc:
error-device%ssamename!
\n",name);
free(module);
returnNULL;
}
/*CheckID*/
if((pmodule->type&MODULE_TYPE_MASK)==type)
{
id++;
}
}
/*Clearmodulestructure*/
memset((UINT8*)module,0,size);
module->type=(type|id);
module->name=name;
/*将模块加入列表,统一管理*/
if(module_com_base==NULL)
{
module_com_base=module;
module->next=NULL;
}
else
{
for(pmodule=module_com_base;pmodule->next!
=NULL;pmodule=pmodule->next);
pmodule->next=module;
module->next=NULL;
}
returnmodule;
}
/*释放模块空间,并将模块从模块链表删除*/
INT32module_free(void*module)
{
structmodule_com_interface*pmodule;
structmodule_com_interface*temp;
temp=&(structmodule_com_interface*)module;
/*Ifmoduleindev_queue,deleteitfromqueue,elsefreeitdirectly*/
if(module_com_base!
=NULL)
{
if(STRCMP(module_com_base->name,temp->name)==0)
{
module_com_base=temp->next;
}
else
{
for(pmodule=module_com_base;pmodule->next!
=NULL;pmodule=pmodule->next)
{
if(STRCMP(pmodule->next->name,temp->name)==0)
{
pmodule->next=temp->next;
break;
}
}
}
}
free(module);/*释放模块空间*/
returnSUCCESS;
}
/*查找Demo模块实现*/
void*module_get_by_name(INT8*name)/*通过名字查找模块*/
{
structmodule_com_interface*module;
for(module=module_com_base;module!
=NULL;module=module->next)
{
/*Findthemodule*/
if(STRCMP(module->name,name)==0)
{
returnmodule;
}
}
returnNULL;
}
/*通过类型查找模块*/
void*module_get_by_type(UINT32type,UINT16id)
{
structmodule_com_interface*module;
for(module=module_com_base;module!
=NULL;module=module->next)
{
/*Findthemodule*/
if(module->type==(type|id))
{
returnmodule;
}
}
returnNULL;
}
5.1.3模块功能函数:
定义:
#defineSYS_MODULE_TYPE_DEMO0x00010000
声明:
INT32module_demo_attach(char*name);/*通过模块名字,注册(加载)模块*/
INT32module_demo_init();/*Demo模块初始化*/
INT32module_demo_io_ctrl(structmodule_demo_interface*module,INT32cmd,UINT32param);
/*Demo模块功能控制*/
实现:
/*注册(加载)Demo模块实现*/
INT32module_demo_attach(char*name)
{
structmodule_demo_interface*module;
if(module=module_malloc(SYS_MODULE_TYPE_DEMO,name,sizeof(structmodule_demo_interface))==NULL)
returnERR_FAILURE;
module->init=module_demo_init;
module->io_ctl=(INT32(*)(void*,UINT32,UINT32))module_demo_io_ctrl;
returnSUCCESS;
}
INT32module_demo_init()/*Demo模块初始化*/
{
/*addinitcode*/
returnSUCCESS;
}
INT32module_demo_io_ctrl(structmodule_demo_interface*module,INT32cmd,UINT32param)
/*Demo模块功能控制*/
{
switch(cmd)
{
caseMODULE_FUNCTION_1:
/*addfunction1*/
break;
caseMODULE_FUNCTION_2:
/*addfunction2*/
break;
default:
break;
}
returnSUCCESS;
}
5.1.4系统与模块的接口函数:
在应用中,模块中,只需要调用接口函数即可,无需了解模块具体实现方式。
声明:
INT32demo_init();
INT32demo_io_ctrl(structmodule_demo_interface*module,INT32cmd,UINT32param);
实现:
INT32demo_init()
{
INT32result=SUCCESS;
/*Openthisdevice*/
if(module->init)
{
result=module->init();
}
returnresult;
}
INT32demo_io_ctrl(structmodule_demo_interface*module,INT32cmd,UINT32param)
{
INT32result=SUCCESS;
/*Closethismodule*/
if(module->io_ctrl)
{
result=module->io_ctrl(module,cmd,param);
}
returnresult;
}
5.2模块化举例设计:
模块需求:
函数实现对汽车功能的控制,包括“学习汽车知识”、“买车”、“开车”、“修车”、“卖车”、“忘记汽车知识”“卸载此模块”等技能,通过打印信息体现。
模块实现:
第一步:
实现模块功能(模块设计小组完成)
structmodule_car_interface{
UINT32type;/*模块类型(前16位)&&同类型模块ID(后16位)*/
INT8*module_name;/*模块名字*/
structmodule_car_interface*next;/*指向下一个模块结构,用于模块管理*/
/*模块私有数据结构*/
void*priv;/*私有数据指针*/
/*Demo模块功能函数*/
INT32(*init)();/*Demo模块初始化*/
INT32(*io_ctl)(structmodule_car_interface*module,INT32cmd,UINT32param);/*Demo模块功能控制*/
};
#defineSYS_MODULE_TYPE_CAR0x00010000
enumcar_cmd{
MODULE_FUNCTION_1=1,/*买车*/
MODULE_FUNCTION_2,/*开车*/
MODULE_FUNCTION_3,/*修车*/
MODULE_FUNCTION_4,/*卖车*/
MODULE_FUNCTION_5,/*忘记汽车知识*/
};
A、Mercedes_Benz模块
INT32module_Mercedes_Benz_init(structmodule_car_interface*car)/*Demo模块初始化*/
{
/*addinitcode*/
MODULE_CAR_PRINTF("学习%s汽车知识!
\n",car->name);
returnSUCCESS;
}
/*Mercedes_Benz模块功能控制*/
INT32module_Mercedes_Benz_io_ctrl(structmodule_car_interface*car,INT32cmd,UINT32param)
{
switch(cmd)
{
caseMODULE_FUNCTION_1:
/*addfunction1*/
MODULE_CAR_PRINTF("买%s车,花费150万!
\n",car->name);
break;
caseMODULE_FUNCTION_2:
/*addfunction2*/
MODULE_CAR_PRINTF("开%s车,加速到180公里/小时!
\n",car->name);
break;
caseMODULE_FUNCTION_3:
/*addfunction3*/
MODULE_CAR_PRINTF("修%s车,花费2千!
\n",car->name);
break;
caseMODULE_FUNCTION_4:
/*addfunction4*/
MODULE_CAR_PRINTF("卖%s车,收入105万!
\n",car->name);
break;
caseMODULE_FUNCTION_5:
/*addfunction5*/
MODULE_CAR_PRINTF("忘记%s汽车知识!
\n",car->name);
break;
default:
MODULE_CAR_PRINTF("%s:
无此技能!
\n",car->name);
break;
}
returnSUCCESS;
}
INT32module_Mercedes_Benz_attach(char*name)/*通过模块名字,注册模块*/
{
structmodule_car_interface*car;
MODULE_CAR_PRINTF("加载%s模块!
\n",name);
if((car=(structmodule_car_interface*)module_malloc(SYS_MODULE_TYPE_CAR,name,sizeof(structmodule_car_interface)))==NULL)
returnERR_FAILURE;
car->init=(INT32(*)(void*))module_Mercedes_Benz_init;
car->io_ctrl=(INT32(*)(void*,UINT32,UINT32))module_Mercedes_Benz_io_ctrl;
MODULE_CAR_PRINTF("%s:
模块加载成功!
\n",car->name);
returnSUCCESS;
}
INT32module_Mercedes_Benz_detach(structmodule_car_interface*car)/*通过模块名字,注销模块*/
{
MODULE_CAR_PRINTF("卸载%s模块!
\n",car->name);
module_free(car);
returnSUCCESS;
}
B、PORSCHE模块
/*Demo模块初始化*/
INT32module_PORSCHE_init(structmodule_car_interface*car)
{
/*addinitcode*/
MODULE_CAR_PRINTF("学习%s汽车知识!
\n",car->name);
returnSUCCESS;
}
/*PORSCHE模块功能控制*/
INT32module_PORSCHE_io_ctrl(structmodule_car_interface*car,INT32cmd,UINT32param)
{
switch(cmd)
{
caseMODULE_FUNCTION_1:
/*addfunction1*/
MODULE_CAR_PRINTF("买%s车,花费300万!
\n",car->name);
break;
caseMODULE_FUNCTION_2:
/*addfunction2*/
MODULE_CAR_PRINTF("开%s车,加速到200公里/小时!
!
\n",car->name);
break;
caseMODULE_FUNCTION_3:
/*addfunction3*/
MODULE_CAR_PRINTF("修%s车,花费5千!
\n",car->name);
break;
caseMODULE_FUNCTION_4:
/*addfunction4*/
MODULE_CAR_PRINTF("卖%s车,收入240万!
\n",car->name);
break;
caseMODULE_FUNCTION_5:
/*addfunction5*/
MODULE_CAR_PRINTF("忘记%s汽车知识!
\n",car->name);
break;
default:
MODULE_CAR_PRINTF("%s:
无此技能!
\n",car->name);
break;
}
returnSUCCESS;
}
INT32module_PORSCHE_attach(char*name)/*通过模块名字,注册模块*/
{
structmodule_car_interface*car;
MODULE_CAR_PRINTF("加载%s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 模块化 设计 思想 详解