完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
片头
最近和一群朋友聊天,不知不觉就聊到软件设计的依据的问题,有的说依据就是需求,有的说依据就是代码规范,有的说依据就是公司规定,虽然大家都做了差不多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单片机下的“环形缓存”软件组件(也可以叫软件模块),从整个模块来说功能单一,从函数来说功能也是单一。至此单一职责原则介绍到此,下次介绍“开闭原则”在单片机代码中的应用,希望对大家有帮助,高手请跳过,谢谢。 |
|
|
|
只有小组成员才能发言,加入小组>>
imx6ull 和 lan8742 工作起来不正常, ping 老是丢包
633 浏览 0 评论
3336 浏览 9 评论
3013 浏览 16 评论
3506 浏览 1 评论
9098 浏览 16 评论
1216浏览 3评论
631浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
619浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2361浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1926浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-11 13:45 , Processed in 1.130950 second(s), Total 46, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号