在去野三坡的途中,和Linc谈起火车的架构来,感觉其扩展性特别好。车厢可以载人,可以载媒,可以载货,可以载坦克,可以载飞机,火车头可以有一个,也可以有多个,可以在两头,可以在中间。
回来以此为题,大家一起讨论一下设计。
一直认为,设计如哲学一样,大道同源。其道理一定可以应用到各个领域。因此火车也需要设计,因此软件也需要设计。
那好,我们开始设计吧。
这时候,你想到了什么?火车的扩展性?
是的,至少我们讨论的时候,第一个想到的就是这个。因此我们开始考虑应该提供一个基类,来描述什么样的是车厢,所有满足此条件的车厢就可以挂接到火车上了。
有什么呢?轮子、前后接轨。底盘。还有人提到是不是应该有电源接口。也是有一定道理的。正当我们大声讨论还有哪些特性的时候,Linc终于忍不住要发话了。后来证明,他早就如鲠在喉,不吐不快了!
Linc讲到,我们的设计不要一下子深入到细节。有道理!大凡设计,大概有两种基本方法,自上而下和自下而上。一般在架构的时候,我们都采用自上而下的方法来统揽全局,而到细部设计的时候,我们采用自下而上的方式保证不遗漏细节。
显然,Linc同学的想法已经不是一天了,他迅速地在纸上描述出自己的构想。
考虑火车由什么组成:火车头和N个车厢。于是Linc同学认为,火车的能力和是有各车厢的能力体现的。那么抽象一个此行为的车厢,整个火车都是这个车厢的派生类(呵呵,想法比较大胆啊)。火车车厢再按照功能分类。有动力车厢、载人车厢、载货车厢等等。对于火车来说,你不要关心其组成细节,它有几个火车头?几节车厢?你都不需要知道。只告诉你火车能做甚么。Linc称这就是组合模式(Composite)
后来,我们曾经就什么是组合模式,大大争论了一番。最后发现我原来对组合模式的理解是片面的。这是后话。
设计如果就到这,就不能体现什么是设计了。至少我是这么认为的。我提出了另一个想法(其实我之前没有好好考虑过,但是听了Linc后就有了这些想法,这也许就是集体的力量吧,或者说是:头脑风暴?)。
我们其实还是在考虑火车的结构,不管是细节还是架构!我想设计应该从更高点看问题:火车是什么?火车对“外”提供哪些功能?火车要能走轨道,能进站,出站,能紧急刹车,能倒车掉头,火车能悬浮?火车能充电?等等。
面向对象设计中,最开始都是先要找到对象,然后再看其结构及其完成功能所需要的架构。
经过这些讨论,我们慢慢地对火车有了逐渐清晰的理解。我们的讨论看似比较随意,但稍微留心,其实可以发现我们讨论一个完整的设计的时候的思路。
1、 面向对象分析:找出对象,及外界对对象的要求(功能)
2、 面向对象设计:架构出组织结构,及实现思路
3、 面向接口设计:局部设计、优化。
我们平常最容易一开始陷入的就是第3个,典型的自下而上方式。上面提的这个思路当然不是绝对好,只是可以帮助我们进行理顺思路。有句话说的好,过分关注细节,会让我们因为没考虑到而放弃,而关注高层,会让我们因为考虑了而放弃。
咱们很多人不能够有机会参与完整的项目设计,但是,只要我们把一个小问题详细完整地进行考虑,思路是一样的。多做这方面的讨论,能给我们带来很多意想不到的收获。
查看本文来源