单片机的代码如何在C一级结构化呢? — 发散
state模式处理多态的能力要比虚函数继承强很多也灵活很多。事实上,基于继承的虚函数实现多态,才是处理简单的interface的方法,更复杂的情况往往都是通过state模式来实现的。
另外我补充一点,c++的多重继承毫无疑问是重型灾害,在任何情况下都不应该使用;但我说的是单继承——单继承也不是一个优先考虑的解决方案,类聚合在大部分情况下都优先于类继承。
我还要说一点,继承虚函数仅仅是实现多态的一种方式,而且远远不是最好的方式。从灵活性,对应改变的能力,对复杂多态的实现能力上来说,state模式都胜过虚函数很多。
回到老U的情况(很久没写c代码了,我写点伪码吧),你可以定义一个CSPI结构
struct CSPI{
void 通用函数1(){……};
void 通用函数2(){……};
….
struct *具体硬件 = null;
void set(string 硬件名){
*具体硬件 = product(硬件名); //此处product函数返回对应于硬件名的子struct对象
}
void SPIRead (){
if(具体硬件 == null) 抛出异常;
具体硬件->SPIRead ();
}
void SPIPowerDown(){
if(具体硬件 == null) 抛出异常;
具体硬件->SPIPowerDown();
}
}
这样当你需要添加更多的子硬件类型的时候,CSPI结构不需要做任何修改,你需要做的就是写一个子硬件类型的struct,然后更新一下product方法(简单工厂)。
这个方法应该说是我最需要的static binding,而且它比macro控制好的地方是编译器仍然可以做类型检查;比interface好的地方是没有动态绑定,也不会有ripple effect。缺点是coding量比较大,因为每一个被调用的都需要全部实现所有的函数形式,但是考虑到它仍然有类型检查,以及单片机可怜的效率,这么做是值得的。
PS: 设计模式该看看了。
Recent Comments