Zhang Jiuan’ Notes

狗叫了 主人醒了 小偷吓跑了(二)

    之前的一篇文章,同样的题目只是作了个引子,并没有作实质性的讨论。现在逐步讨论这道题目。狗叫了,主人醒了,小偷吓跑了。很形象的一个事情,如何使程序来表达它呢?如何考虑可扩展性呢?
    深入的想一下,狗叫了是一个事件,主人醒了是一个结果;继而主人醒了是一个事件,小偷吓跑了又是一个结果;更进一步是否存在小偷吓跑了作为事件的后继结果呢?结论是很显然的。那么这样分析就很简单了,以事件作为驱动便顺理成章。
    理次深入一下,狗叫了,是否有原因呢?狗叫是否是狗的自然属性呢,狗叫和主人醒是否可归结为同一事件属性呢?这个显然不合理。如果狗叫是原始属性的化,那么主人配便是触发事件,然后小偷吓跑了又该归结哪一类事件呢?
    想到这里,于是我们的设计就有一个轮廓了,有一样东西叫事件,这些事件会触发一些东作的发生。这是核心,其它都基于这个来完成。
class BaseEvent {
    virtual int actionPerform() = 0;
}
class DogEvent {
    int actionPerform() {
         ….
    }
}
….
这样似乎还缺了些东西,与事件绑定的动作,这个动作不一定是一个,那么它应该维护一个链表动作,只需要在对应Event上进行挂接就可以了。
因此修改后的BaseEvent变为:
class BaseEvent {
    private:
    action* action_list;
   virtual int actionPerform() = 0;
}
是的,这样的确可以解释很多东西了,但是仍旧有些牵强。因为事件作动作,似乎并不合理。事件是单纯的事件,它不应该有监听的功能,也不应该有作什么动作的功能。顺着这条思路我们似乎缺少一个监听功能的监听器。由此有了如下思维的扩展。
class EventListener {
    BaseEvent *event_list;
    Action * action_list;
    int actionPerform(Event e) {
         switch (e) {
             case ……
            ……..
        }
……..
}
这样似乎逻辑更清晰的多了。可扩展性也是显而易见的。当然,许多地方为我为提供了现呈的东西,但深入思考一下这些机制,是很有益处的。
各位读者,如果您读到这里是否能够顺着这种思路更进一步的去思考它的逻辑结构呢?
 
thx
张久安
If you enjoyed this post, make sure you subscribe [...]

抛开语言谈设计,走进语言谈编程

    在一个系统设计的时候,有些工程师往往拘泥于语言的实现上。在它们看来往往存在一些这样的疑惑:这种东西使某某语言不可实现,因此它认为无法实现。实际这是一个误区,设计的时候可行性不是由语言决定的,页是由逻辑可行性决定的。具体实现,可能与语言相关。当然,也可能这种语言可以实现的功能,往往因为习惯性的拘泥于视脚的思维,认为不可实现。往往跳出来,从更高的一个角度去思考,它并不是不可实现的,只是实现的方式不同罢了。
    当然,具体的实现还是落实到一行行的代码上,这时候对于语言的掌握便起到了决定性的作用。可能设计的可能行的东西真的使某一语言不好实现,但换个角度是否通过模块的划分使逻辑更加清晰,便实现更为灵活了呢?在这样的思维引导下,您的实现可能会有无心插柳柳成荫的收获。
 
thx
张久安
If you enjoyed this post, make sure you subscribe to my RSS feed!

,

返回顶部