凡亿教育-麦麦
凡事用心,一起进步
打开APP
公司名片
凡亿专栏 | 嵌入式C语言设计模式
嵌入式C语言设计模式

我是老温,一名热爱学习的嵌入式工程师
关注我,一起变得更加优秀!
1 - 什么是设计模式?

关于设计模式的概念,在网络上只需要搜索“什么是设计模式?”,就会有不少关于设计模式的概念介绍。

通俗地概括,设计模式就是一套写代码方面的最佳实践经验总结,这些经验总结已经被很多软件工程师知晓,并且在实际项目中反复验证。

设计模式起源于1994年,最初由4位外国的软件工程师(Gang of Four,简称GOF)提出,他们提出可复用的面向对象软件元素---设计模式,是基于以下两点原则进行设计的:

1-对接口编程而非对实现编程。
2-优先使用对象组合而不是继承。

GOF一共提出了23种设计模式,这些设计模式可以分为三个大类:创建型模式、结构型模式、行为型模式。

创建型模式:工厂模式,抽象工厂模式,单例模式,建造者模式,原型模式

结构型模式:适配器模式,桥接模式,过滤器模式,组合模式,装饰器模式,外观模式,享元模式,代理模式

行为型模式:责任链模式,命令模式,解释器模式,迭代器模式,中介者模式,备忘录模式,观察者模式,状态模式,空对象模式,策略模式,模板模式,访问者模式

设计模式会遵循以下六大原则:

开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、最少知道原则(迪米特法则)、合成复用原则。




2 - 为什么嵌入式要用设计模式?

纵观网络上很多嵌入式相关的代码例程,基本上都是面向过程和面向实现而进行编程的,一部分原因,是跟面向过程的C语言属性有关,

另一方面,很多嵌入式开发的入门教程,都没有对“设计模式”这些概念进行具体介绍,而是把侧重点放在了代码的执行过程和例程演示。

由于嵌入式开发一般脱离不了硬件底层设计,对于刚刚入行的嵌入式初学者,他们所接触的代码例程都是以面向过程面向实现来进行演示,

这就容易让他们形成了“过程实现式”思维,而非“对象抽象化”思维,这种思维定势,一般会伴随嵌入式软件工程师整个软件开发生涯。

设计模式无论对于自己对于他人,还是对于整个系统设计,都是多赢的,因为使用设计模式构建的系统,可以使软件代码实现真正的工程化,让代码更容易被他人理解,并且保证代码的可靠性,

因此,设计模式是软件工程的基石(此外,还有数据结构和算法)

在嵌入式软件开发过程中,每种设计模式都有其对应的工作原理,并且针对特定的问题给出该问题核心的解决方案,这也是设计模式在很多大中型软件工程中被广泛使用的原因。

设计模式为软件开发人员提供了标准的术语,并且每种设计模式都具体到了特定的情景,所以,经验不足的软件开发人员可以通过对设计模式的学习,简单快捷地掌握基本的软件工程设计。

使用C语言作为主要编程语言的Linux内核,里面大量使用了设计模式,没有面向对象设计思维,不会设计模式的工程师,一般很难理解Linux内核的设计精髓。

需要重点说明的是,本文以及本系列文章,并不是在“神化”并盲目放大设计模式的优势之处,也并不是泛指凡是嵌入式设备都必须用上设计模式作为编码指导,

作为嵌入式工程师,应该根据自身项目的复杂度以及项目规模,在兼顾开发效率的同时,选择合适的设计方案。

本系列文章旨在提供一种设计思路,当嵌入式软件工程师在开发过程中遇到实际问题的时候,可以更好地参考前辈总结的最佳实践方案。





3 – 嵌入式软件如何使用设计模式?

设计模式不是高级编程语言(面向对象编程语言)独有的东西,面向对象编程语言由于其语法特性,可以很方便很简单地在实际软件开发中应用设计模式。

而对于一名嵌入式软件工程师,学习设计模式,更多的是需要学习设计模式背后的原理,以及学习设计模式所针对的问题场景,从而养成设计模式的应用思维,而不是让思维受限于编程语言。

对于大多数嵌入式软件工程师而言,C语言是使用频率最高的编程语言,因此,在学习嵌入式软件如何使用设计模式之前,嵌入式软件工程师应该先学会如何使用C语言进行面向对象的设计。

在大中型嵌入式软件开发过程中,嵌入式工程师应注重养成面向对象和面向接口开发的思维方式,这对整个软件架构的可靠性和扩展性,都是有很大好处的。

网上有不少文章,讲述关于如何使用C语言进行面向对象程序设计,各位可以自行搜索学习,至少需要掌握如何用C语言实现面向对象语言的一些特性,如继承、封装、多态、组合,等等。


特别地说明一下,为了跟面向对象设计的概念同步,后面的文章会更多地使用面向对象开发的专业术语,比如:



封装:动词,表示用结构体把一系列的变量和函数指针进行打包。



继承:动词,表示用新的结构体包含一个父结构体,且这个父结构体要在首位置。



抽象:动词,表示开发者需要思考如何提取出事物的特征。



类:名词,表示进行封装之后的结构体类型,也就是指 struct uart_handler。



子类:名词,表示用一个新的结构体包含一个父结构体,得出一个新的结构体类型。



实例:名词,也可以叫对象或类对象,表示用结构体进行定义的变量,例如:struct uart_handler uart。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表凡亿课堂立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。
相关阅读
进入分区查看更多精彩内容>
精彩评论

暂无评论