片头
最近和一群朋友聊天,不知不觉就聊到软件设计的依据的问题,有的说依据就是需求,有的说依据就是代码规范,有的说依据就是公司规定,虽然大家都做了差不多10年设计,水平是有的,但是也没高到天上去。主要还是受限于所处环境及工作行业性质,有的朋友还不知道有6个设计原则。也许这个6个设计原则太高端,底层涉及不到。因此在这里想把高大上的6个设计原则拉下“水”,与低端的单片机程序设计做个 “联姻”。六个设计原则分别是:A、单一职责原则;B、开闭原则;C、里氏替换原则;D、最少知识原则;E、接口隔离原则;F、依赖倒置原则;G、激活原则;
以上有7个,最后一个是我加上去的,此文主要介绍第一个设计原则:单一职责原则,单一职责在设计STM32单片机软件的应用。
正文
定义:顾名思义,职责重在单一,防止过尤尔不及(概念很重要)。
要做的“单一职责原则”首要任意就是解决(确定)范围,即单一职责的软件单位。那么在单片机软件开发中的职责单一的软件单位是什么呢?是一个函数,一个结构体,一个枚举定义,一个软件模块(XXX.c与XXX.h)。
一个不遵循“单一职责原则”的函数如下:
void getResult(u8 Data1,u8 Data2,u16 *sum,u8 *max)
{
*sum= Data1+ Data2;
if(Data1> Data2) *max= Data1;
else *max= Data2;
}
以上代码简单:实现两个数据的求和,还有找出两个数据最大者,它们做了两件事,所以不符合 “单一职责原则”;改成如下即可。
void getSum(u8 Data1,u8 Data2,u16 *sum)
{
*sum= Data1+ Data2;
}
void getResult(u8 Data1,u8 Data2, u8 *max)
{
if(Data1> Data2) *max= Data1;
else *max= Data2;
}
以上的代码比较简单些,下面以环形缓存作为一个例子阐述单一职责原则。环形缓存是常用的一个软件组件,单片机中常应用通信,ADC采样数据的缓存等。环形缓存的效果图如下:
上图所示是一个大小为64单元的环形缓存示意图,绿色inIndex与outIndex表示当前操作环形缓存位置索引指针。蓝色描述缓存大小,已用大小及空闲大小。绿色与橙色长回环箭头,表示操作索引指针返回处,即有此形成环形。更加形象的如下图所示:
下面新建一对文件模块,命名如为ringbuff.c与ringbuff.h;在头文件中定义环形缓存结构体如下:
再定义一个环形缓存状态枚举类型如下
再定义一个缓存操作结果枚举类型
至此环形缓存需要定义的类型定义完毕;由上面代码可见,结构体功能单一,枚举有两个,完美地遵循了“职责单一原则”;没有不相关的定义。
环形缓存的操作接口函数有:接头体实例初始化,入缓存,出缓存,以下在“ringbuff.c”中实现下这三个函数。
实例初始化:
单一成员进入环形缓存:
多成员进入环形缓存
单一成员出环形缓存
在“ringbuff.h”中列出上面四个函数如下
总结:
所谓“单一职责原则”,就是功能单一,以上代码是STM32单片机下的“环形缓存”软件组件(也可以叫软件模块),从整个模块来说功能单一,从函数来说功能也是单一。至此单一职责原则介绍到此,下次介绍“开闭原则”在单片机代码中的应用,希望对大家有帮助,高手请跳过,谢谢。