1、全局变量泛滥
全局变量的泛滥是嵌入式系统中烂代码的一个杰出特征。
1.1 泛滥的表现
全局变量过多。全局变量过多,导致维护者(包括几个月后的开发者本人)在分析、修改代码的过程中无所是从。有时候为了了解一小段代码的功能,需要搞清楚十几个全局变量所代表的含义、这些变量会在什么时候被改变、什么时候
会被调用。人脑的“栈”空间是有限的,一下子要存入这么多东西,瞬间不够用了。
全局变量到处都在被赋值。有时候为了找出系统状态改变的原因,需要知道某个全局变量在哪里被改变了;这个时候一查找,发现很多地方都对这个变量进行了改变。为此,我们需要针对每一处改变的地方进行分析;这真是很让人郁闷的
一件事。
多个全局变量相互依赖。某些全局变量使用的地方并不算多,似乎很容易分析;然而找到某处调用的地方,你却发现
它的改变依赖于其他几个全局变量的值。这几个全局变量的值又依赖于其他全局变量。于是你开始一层层查找下去。到
最后,你发现为了搞清楚第一个全局变量的使用情况,你几乎要翻阅几十个文件。这也是很让人崩溃的地方。
1.2 泛滥的危害
从上一节,我们可以看到,滥用全局变量的一个很重大的危害在于,我们在维护的过程中将变得极其困难:我们需要
花费很多的精力才能搞清楚这个变量的使用情况,然后才能对代码进行分析、改进。
除此之外,还存在其他方面的危害。
很多工程师习惯于直接对全局变量进行修改和判断使用,而不对其进行任何封装
保护。这直接导致全局变量暴露给外部,也许一个不小心我们就把它意外赋值了(比如本来想改变其中一个比特位,
却把其他比特位也改变了)。
另外,对于多任务系统来说,全局变量也是造成共享数据访问冲突的一个重要原因。如果不对全局变量进行规范化处理,
将需要在各个地方对全局变量进行保护,这很容易造成死锁。
1.3 改进措施
1)尽量避免使用全局变量。能用局部变量的,就不要用全局变量;能用模块全局变量的,就不要用系统全局变量。
2)函数传参替代全局变量的使用。某些信息在函数之间的传递,完全可以用函数传参的方式来实现,因而没有必要
使用全局变量。
3)对全局变量实行统一管理。全局变量也可看做是一种资源。我们在对外设进行操作的时候,经常会对其进行接口封装,
而不是每次都直接操作其寄存器。为什么在使用全局变量的使用过程中我们就不这么做了呢?要知道,将实现和使用分离,
对我们后续的维护工作可是很大的一个帮助啊。
2、函数封装
2.1 不良封装的表现及危害
1)层次不清;
2)模块耦合;
3)函数过长;
4)流程混乱;
5)使用全局变量替代传参
6)函数命名没有足够的提示作用