1. 首先观看刘姥姥代码中的条件编译
这是预先定义宏,通过判断该宏是否定义,条件选择定义哪一种硬件所需要的宏。从上面可以的出来,我们只能固定先定义哪一个宏,这在不同硬件中会有错误,同时也非常不灵活,可拓展性很低,每添加一种硬件,就需要添加一种硬件的宏定义,同时执行函数中也需要添加一种宏定义。由此我们开始对症下药,选择动态选择的方法进行改进。
2.接下来我们来看刘姥姥模块如何应对不同硬件所作出改进
首先,定义了一个结构体,如下:
它是所有硬件的通用体(成员可以添加),可以赋予不同的值代表不同的硬件。
其次,我们定义一个硬件通用体的全局变量,在加载模块进行初始化时,读取当前系统的版本,赋予这个变量值。之后进行各种操作时,只需将它传入即可。用它的成员变量值去计算,即可完成所有操作,免去了多个if,else的条件编译及判断。
这是选择动态选择方法改进后的代码:
从中我们可以看出来执行函数完全不用在进行选择了,只需应用传入的结构体变量成员即可,不仅方便函数调用,而且减少了代码量,对于以后更多的硬件,也只需在初始化的时候多加一种硬件即可,可拓展性极强。
3. 最后我们来看刘姥姥模块在不同硬件中的应用
a.在ULAN版本中,使用刘姥姥模块执行温度函数。效果如下
b.在ULAN版本中,使用刘姥姥模块执行温度函数。效果如下
可以看到执行模块初始化的时候也会打印出当前的版本,同时它也可以流畅的进行温度函数执行。
经过改进,不光代码的数量还代码的可拓展性,它都是优于静态条件编译的。虽然两种方法都可以解决它,但是我们对于代码的追求,应该要精益求精。一种问题总是可以找到多种解决方法,但我们应该选择最优,最简洁明了的。最后,我想说:横看成岭侧成峰,远近高低各不同,多从不同的角度去看事,去解决问题,会有不同的结果,或许它很惊奇!