Home > Other > 单片机的代码如何在C一级结构化呢? — 发散

单片机的代码如何在C一级结构化呢? — 发散

November 30th, 2009 cashplk Leave a comment Go to comments

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: 设计模式该看看了。

Categories: Other Tags: , ,
  1. No comments yet.
  1. No trackbacks yet.

Powered by WP Hashcash

Spam Protection by WP-SpamFree

cashplk的心路历程 is Digg proof thanks to caching by WP Super Cache