First we try, then we trust

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  183 随笔 :: 111 文章 :: 3315 评论 :: 358 引用
    内容篇幅较长,请点击这里阅读全文
posted on 2004-08-26 23:52 吕震宇 阅读(3195) 评论(13) 编辑 收藏

评论

#1楼 2004-08-27 14:17 age0
如果设计模式是教人如何不用写代码的,那倒还不错,但设计模式不但要你写代码,还规定了你写代码的单一模式,这是典型得不能再典型的拘泥于某个招式的超级反面示例,记不记得令狐冲是如何得以步入无招胜有招的境界的?

“令狐冲见他如此顾虑多端,不由得心痒难搔,一门武功越是难学,自然威力越强,只听风清扬又喃喃的道:“第一招中的三百六十种变化如果忘记了一变,第三招便会使得不对,这倒有些为难了。”令狐冲听得单是第一招便有三百六十种变化,不由得吃了一惊”
 回复 引用   

#2楼 2004-08-27 14:34 吕震宇
@age0

没有“有招”那里来的“无招”?虽然我开始学习设计模式仅仅只有两三年的时间,感觉模式学习到一定程度后需要感悟一种思想,而这种深刻的思想便是“无招”。

一步登天也许只有在武侠小说中才吹嘘的神乎其神。写模式的人是将思想寄托与模式,而学模式的人应当从从模式中感悟思想。
 回复 引用   

#3楼 2004-08-27 17:02 age0
我并没有说过“无招”可以一步登天,金庸先生也没有说过,恰恰相反,独孤九剑“单是第一招便有三百六十种变化”,设计模式差得远呢。

所以设计模式看一下就好了,不要太较真,如果设计模式第一式就有三百六十种变化,那就很值得深究。
 回复 引用   

#4楼 2004-08-27 19:46 吕震宇
你相信“单是第一招便有三百六十种变化”吗?我不信
 回复 引用   

#5楼 2004-08-28 00:16 寒枫天伤
第一招有三百六十种变化,我认为是可信的,但是这三百六十种变化有哪些是有真正用的?
我坚信两点之间只有一条直线,并且这条直线是最短的距离。

这与练武是一样的,你先要学习无数种招式,并且把它们真正的融会贯通才能创造出自己的东西,那样才能达到无招胜有招的境界。

如果一点根底也没有,就妄想超越一切,无非是在欺骗自己罢了。

独孤九剑,再怎么也有九种模式吧?
它是真的无招吗?我看未必。

就以Abstract Factory Pattern来说,应该不仅仅是有三百六十种变化了吧?无论对于哪一类软件,只要遇到相同的处境,都可以使用相同的模式解决,莫非这个理念有误?
设计模式是在探索开发稳健与快速设计间的寻找的平衡点。
至少,目前,在没有真正玩通它们之前,我认为你的无招胜有招,不过就是一个没练过武的人,就是力气大点,却一天到晚对着苦练了数年,有着无数经验的武者们大吼:“你的武功不过如此而已,看我的无招胜有招”,结果只能是鼻青脸肿。

浮躁啊........
 回复 引用   

#6楼 2004-08-28 00:18 寒枫天伤
@吕震宇

对你的系列文章继续关注中.............

我正计划做一个模式代码生成器,专门用于配置简单的代码框架。
Together和XDE for .net在这方面不太好用。
 回复 引用   

#7楼 2004-08-28 00:58 吕震宇
@寒枫天伤

我会写下去的,毕竟它还是我的“教案”呀 :-) ,只是把GoF的23种模式写完确实不容易。而且水平原因,写的不很深入。我尽力吧。

对于模式代码生成器,我只用过Together,凭它要将几种模式组合起来以完成更复杂的任务很困难,很多时候必须手工实现代码。还有一个令我困惑的问题就是:出于耦合考虑,编写程序时,可能将一个模式的不同部件放在不同的命名空间中,形成不同的DLL构件,Together无法识别出不同命名空间中构成的模式。

希望早日看到你的模式代码生成器。

 回复 引用   

#8楼 2004-08-28 10:49 age0
“三百六十种变化有哪些是有真正用的?我坚信两点之间只有一条直线,并且这条直线是最短的距离。”

说的好,在平面几何的单一系统上两点间直线确实是最短,但现实世界是纷繁复杂的,是由无数系统缠绕交织而成的复杂体系,企图用单一理论去解决现实问题只会碰的头破血流。两点间直线距离最短,但从北京去上海,你会不会走直线距离?坐飞机的话确实能够很接近直线距离,但代价是昂贵机票,还要受天气影响。

独孤九剑第一招就有三百六十种变化,每一种变化都可以达到伤人目的,但敌人不是木偶,不会站在那里等你的剑去完成两点间直线距离,而会防守、闪避或反击。招式的每一种变化都隐含着这样一种信息:当敌人漏出什么样的破绽的时候,你应该以哪种方式从哪种角度攻击最有利。

“九剑的第一招‘总诀式’,有种种变化,用以体演这篇总诀。第二招是‘破剑式’,用以破解普天下各门各派的剑法。第三招‘破刀式’,用以破解单刀、双刀、柳叶刀、鬼头刀、大砍刀、斩马刀种种刀法。”

设计模式第六式Abstract Factory用以破解客户的工厂产品需求?我并不是想要证明设计模式没有任何用处,只是想说仅凭23种模式是绝对无法描述软件设计的精妙绝伦之处,不管它是由阿猫阿狗发明的还是由GOF发明的。

所以设计模式看一看就好,那些HelloWorld式的例子其实非常牵强,如果菜鸟们真是按照这种思路去设计系统的话估计日子会过得比较郁闷。希望楼主在解说模式时,优缺点一并评论,重点指出模式的缺陷,每一种模式为了达到某种预期的效果都必然会牺牲某些特性,而这些特性并不是无关紧要的,这就是所谓的招式破绽,每一式都会有破绽,所以才需要有变化,用不同的变化来弥补破绽。
 回复 引用   

#9楼 2004-08-28 19:39 寒枫天伤
尽管不想辩了,但是还想插句嘴。

你也说了,从北京到上海可以通过交通工具,直线方式到达。那么,也就是说,通过一定的工具,我们就可以达到我们的通过直线方式解决问题目的,对不对?
而且,好像现在通过坐飞机的方式从北京去上海的人好像并不少吧?无论是否受天气影响,总之这是最快捷的方式。
难道因为价格问题,从北京到到上海的飞机就没有价值了吗?

你给我只机关枪加上充足的子弹,就算面对几百个会独孤九剑的高手,我也有把握扫死一片。

独孤九剑,无非也只是想像中的比较理想的九种对敌模式而已.......而且,那也只是冷兵器而已,是枪厉害还是剑厉害?

目前通常所说的这23种设计模式只是相对成熟的,并没有任何人说它们就是万能的,模式的的挖掘也正处于探索的阶段,但目前的模式的优越性并不是简单地炒作出来的。


就算是独孤九剑,也是要有人发明的,莫非发明独孤九剑的人是一点武学招式也没有学过的?他还不是融汇贯通了之后,才能创造出独孤九剑?

设计模式,不是框架,框架是固定的代码,设计模式是思考方式,这一点请注意。它复用的不是代码,是思想,是无数人对世界进行探索与表达中总结出来的经验,如果你非要学死了,我也没办法。

正如速度和公式v = v1+v2一样,大家都在用也没有什么大的问题, 但这个公式并不是完全正确的,想想爱因斯坦给出的速度公式。

科学的进步是建立在对事物的抽象与变化上,是对事物的简化模型进行探索从而得出的结论,这些探索过程也是一些模式化的东西,如果不学,如何能掌握事物的本质?

学设计模式,并不要求你拘泥与它,与其说它是教你如何写代码,不如换个态度,想想它为什么要这样做,这才是学习的本质。

否定一样事物虽然有可能是正确的,但如果前提是你并不了解这个事物的话,那么你的否定是毫无意义的。

另,”希望楼主在解说模式时,优缺点一并评论,重点指出模式的缺陷,每一种模式为了达到某种预期的效果都必然会牺牲某些特性,而这些特性并不是无关紧要的,这就是所谓的招式破绽,每一式都会有破绽,所以才需要有变化,用不同的变化来弥补破绽。 ”
这个观点我同意。
 回复 引用   

#10楼 2004-08-28 19:57 吕震宇
感觉压力很大。以后我会尽量优缺点一并评论,但只能代表一家之言,有什么不妥的地方还靠大家多提意见。

我不想就什么独孤九剑再加什么评论了。
 回复 引用   

#11楼 2004-08-29 10:17 寒枫天伤
压力大是正常的,哈,你这个系列可以算是目前网上最全的教学性资料了。
 回复 引用   

#12楼 2004-10-05 20:37 震宇兄的徒弟
支持老师!
我虽然还只是菜鸟,但从你们的评论还是看出大家至少有一人共同点就是,无论是什么都有一定的模式可以依照的呀!
剑术的招式由什么而来呀,无非是劈呀砍呀剁呀什么的,这是什么呢?这也是模式呀,仁兄!
本人虽然对设计模式知知甚少,但我认为这23种模式,就像基本剑法一样,如果你看过震宇兄其它的文章的话,你还会发现,还有在这23种模式之外的模式,简单模式。这说明,吕SIR并没有拘泥于这23种模式嘛!
话再说回来,你那360种变化不正也说明了,23种模式可以衍生出更多的变化来吗?
至于哪种有用,哪种没有用,那也要就实际问题来定嘛,我想你也不会在剑客面前用破刀式吧!
而无招胜有招之说,我想23种模式只不过是在更高的一个层次上达到忘我的境地,每逢敌手想到的是用哪一串招式对付,而不是先想怎么砍怎么剁,(注意:我说的一串招式并不是指单一的模式,可能是多种模式各取一)。
好了,大家的目的都是最后天下无敌,只不过有些是一路摸爬滚打,一步步积累,有些是依前人之路走的少些弯路罢了。

 回复 引用   

#13楼 2005-01-19 16:00 udprelay
俺的看法是设计模式和数据结构有些共同之处, 解决某些问题需要
采用特定的数据结构,这对设计模式也同样适用.
 回复 引用