韩小明@xiammy的专栏

没水的地方挖井,有水的地方修渠

原创 借火车看设计过程收藏

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

发表于 @ 2006年11月29日 11:28:00|评论(loading...)

新一篇: 堆和栈的区别 | 旧一篇: 原来汉语的思路更接近计算机语言

用户操作
[即时聊天] [发私信] [加为好友]
韩小明
订阅我的博客
XML聚合  FeedSky
韩小明的公告
作者毕业于浙江大学,非常热爱体育运动。现在尤其热爱羽毛球运动。在休息时间非常热爱技术文章写作。
最近垃圾评论泛滥,为了不污染大家的视听,暂时关闭评论,请大家理解。
欢迎转载,但请注意,除非特别声明,本站采用Creative Commons License许可:署名,非商业。

文章分类
收藏
    链接
    宗刚的专栏(RSS)
    快乐学习(RSS)
    陈亮亮的专栏(RSS)
    朋友
    张恂论 OO
    橘子懒懒的BLOG(RSS)
    言之有李(RSS)
    赵伟的小家
    存档
    Csdn Blog version 3.1a
    Copyright © 韩小明