这是一段示例代码,仅用于表达设计意图,可能存在语法错误,
本示例代码演示如何解耦大的switch语句,让其模块化更好;
未做防御式编程处理
typedef void (* protocol_process)(uint8_t *buf, uint len);
/**
* 注册一个处理函数
* 参数说明:
* fun 传入的函数
* funId 该函数的功能编号
*/
void register_process(fun_process fun,uint8_t funId);
void init();
/*
* 收到数据帧后调用的处理
* */
void main_process(uint8_t *buf,uint len);
//-----------------------------我是头文件的结束的分割线-------------------------------------------
/*使用static 使其对外部文件不可见*/
static protocol_process cmdList[256];
/*
* 占位函数保证执行过程中不会调用到空函数
* */
void ErrCmdDo(uint8_t *buff,uint8_t len)
{
Log("未实行的功能\r\n");
}
/*
* 使用占位函数初始处理函数数组
* */
void init()
{
for(int i=0;i<256;i++)
{
cmdList[i]=ErrCmdDo;
}
}
void register_process(fun_process fun,uint8_t funId)
{
cmdList[funId]=fun;
}
void main_process(uint8_t *buf,uint len);
{
uint8_t cmd=GetCmd(buf,len);//*获取输入数据的功能号
protocol_process process=cmdList[cmd];
(*process)();
}
/*--------------------------------------------我是功能函数实现文件的分割线-------------------------------------------------------------*/
#include <register_process.h>
void say_hello_init()
{
register_process(SayHello,2);
}
static void SayHello( uint8_t *buff,uint8_t len)
{
printf("你好\r\n");
}
面向对象风格的写法
//-------------------------------protocol_process.h 协议处理头文件-----------------------------------------------------
/*
*
* */
#define CmdMaxLen 256;
typedef void (* protocol_process)(uint8_t funId,uint8_t *buf, uint len);
sturct protocol_obj
{
protocol_process_list[CmdMaxLen];
};
/**
* 注册一个处理函数
* 参数说明:
* fun 传入的函数
* funId 该函数的功能编号
*/
void protocol_obj_register_process(sturct protocol_obj * thiz,fun_process fun,uint8_t funId);
void protocol_obj_init(sturct protocol_obj *thiz,protocol_process defaultFun);
/*
* 收到数据帧后调用的处理
* */
void protocol_obj_process(sturct protocol_process *thiz,int funId,uint8_t *buf,uint len);
//-----------------------------我是头文件的结束的分割线-------------------------------------------
/*
* 占位函数保证执行过程中不会调用到空函数
* */
void ErrCmdDo(uint8_t *buff,uint8_t len)
{
Log("未实现的功能\r\n");
}
/*
* 使用占位函数初始处理函数数组
* */
void protocol_obj_init(sturct protocol_obj *thiz,protocol_process defaultFun);
{
for(int i=0;i<CmdMaxLen;i++)
{
thiz->protocol_process_list[i]=defaultFun;
}
}
void protocol_obj_register_process(sturct protocol_obj * thiz,fun_process fun,uint8_t funId)
{
thiz->protocol_process_list[funId]=fun;
}
void protocol_obj_process(sturct protocol_process *thiz,int funId,uint8_t *buf,uint len)
{
protocol_process process=thiz->protocol_process_list[funId];
(*process)(funId,buf,len);
}
/*--------------------------------------------我是功能函数实现文件的分割线-------------------------------------------------------------*/
#include <register_process.h>
#define CmdCode=2;
void say_hello_init(sturct protocol_process *obj)
{
register_process(obj,SayHello,CmdCode);
}
static void SayHello(uint8_t funId, uint8_t *buff,uint8_t len)
{
printf("你好\r\n");
}