STM32单片机程序与6个设计原则之开闭原则

 ̄綄美尐妖づ 提交于 2020-02-06 08:17:20

片头

在上一篇文章中已经介绍了“单一职责原则”在单片机程序中的使用,并以“环形缓存”作为介绍切入点,因为“环形缓存”在应用中比较多,所以在介绍“开闭原则”时依然以它作为介绍切入点。

六个设计原则分别是:A、单一职责原则;B、开闭原则;C、里氏替换原则;D、最少知识原则;E、接口隔离原则;F、依赖倒置原则;G、激活原则;

    以上有7个,最后一个是我加上去的,此文主要介绍第二个设计原则:开闭原则在设计STM32单片机软件的应用。

正文

定义:开闭原则表示打开拓展的大门,关闭修改的大门。

要做的“开闭原则”首要任意就是解决(确定)范围,即开闭原则的软件单位。那么在单片机软件开发中的职责单一的软件单位是什么呢?是一个函数,一个结构体,一个枚举定义,一个软件模块(XXX.c与XXX.h)。

首先以一个电路图说明“开闭原则”的例子(在此假设读者具备一定原理图知识)背景假设:此图是一个智能锁的原理图,目前此图版本:V7.0。如下图所示:

由于市场需求需要增加人体识别PIR传感器,需要对V7.0版原理图 “更新”。现在有以下两种更新方案,如下图所示:

以上两种方案,一个调整了原来的信号定义,一个不改变原来信号定义。哪个方案优哪种方案劣?从版本后看:现在到了8.0版,可见之前有很多个版本,需要考虑的情况很多。假设现在V8.0版已经是这个“智能锁”产品的第10个年头了。之前V1.0还有库存吗?假如有一批旧货需要维护,怎么办?V7.0的能替换,V8.0的能替换吗?需要用这个V8.0的产品替换10年前的产品怎么办?于是上面哪个“更新”方案优哪个劣,很容易就看出来了。方案1图一时之快(方便布局,布线---为布线方便),连V7.0的都不能兼容,更何况10年的产品。以上是“开闭原则”在电路原理图上的应用(即对拓展开放,对修改关闭)。

再次以STM32单片机编程实践中如何实现“开闭原则”,还是已“环形缓存”为例说明(需要了解“环形详细情况,请找我前面的文章《STM32单片机程序与6个设计原则之单一职责原则》”)。

现在修改“ringBuff”中的函数参数位置如下图所示:

如上图所示,假如“小李”开发了V1.0版本的Ringbuf管理器,后面“小宋”接手维护修改如V2.0的样子,也不添加功能,也没有重大修改,仅仅因为个人原因(比如看着“RingbuffMgr_t”在第一个位置不舒服),至此V1.0到V2.0从“小宋”手里开始分道扬镳。因为引用V1.0版本Ringbuff组件的旧程序已经不容易迁移到V2.0的Ringbuff,即使不怕麻烦,也多了一个迁移过程,还有衍生出来的验证,测试过程等等。所以,从代码逻辑上说,功能完全没问题;从代码可维护,易用,延续,传承上带来很多麻烦。可见遵守“开闭原则”的重要性。

在上一篇文章中仅对Ringbuff模块实现了有限的几个函数,如下图所示:

现在对这个模块进行拓展(符合“开闭原则”)添加5个环形环形的管理函数如下图所示:

配合清零标志的读“环形缓存”函数如下:

最后对环形缓存模块进行版本升级如下图所示:

从上图可见,从V1.0到V1.1,仅仅是增加了功能。对曾经引用V1.0版本“环形缓存”模块的应用可以从容切换到V1.1版本,并且可以不理会新增功能的情况下正常运行。

总结:

所谓“开闭原则”,就是对某个软件单位的修改关闭,拓展开放,通俗些说就是:可以增加功能,但是不能修改之前的功能(包括参数的位置)。本文从原理图开始到STM32单片机代码下的“环形缓存”软件组件(也可以叫软件模块)介绍了“开闭原则”。从整个模块来说遵守“单一职责原则”与“开闭原则”能让整个模块具有简洁易懂,高内聚的特性。至此开闭原则介绍到此,下次介绍“里氏替换原则”在单片机代码中的应用,希望对大家有帮助,高手请跳过,谢谢。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!