日期:2014-05-20  浏览次数:21041 次

终于拜读完《大话设计模式》了
从3.14到3.23,历时十天,终于拜读完《大话设计模式》了。
确实,学习设计模式有几种境界,第一种是学习了一两个设计模式,就一直想用到自己的代码中去;第二种是学完全部设计模式,觉得很多模式都很相似,分不清楚它们之间有什么区别;第三种是灵活运用设计模式,就算不用具体哪种模式也可以设计也高质量的代码,无剑胜有剑。
我现在完全就是第二种境界了,觉得她们长得太像了,特别是工厂方法和抽象工厂,还有策略模式之类,昏了。
什么时候才能到第三种境界呢?
我的代码该怎样重构呢?
我为什么没有早点学习设计模式呢?
------最佳解决方案--------------------
曾经在我一开始学习设计模式的时候(那时候我还不会C#,用的是VB),我梦想用设计模式编写那些极端通用的,可重用的软件(GoF的设计模式副标题也是这么说的),那时候我经常指着我的代码对别人说,你看,我只要在配置文件里面修改下,我的程序就可以适应不同的需求而不用修改!但是后来我突然惊讶地发现,所谓“极端通用的程序”其实就是在创造DSL。或者简单地说,就是编写一个核心,用配置文件实现装配,配置文件相当于一种领域编程语言,而我的程序核心相当于这种语言的解释器(XML API相当于词法、语法分析器)。

我为什么要费力编写一个脚本语言的解释器呢,当配置文件复杂的时候,程序的配置出现了困难——配置文件的配置方法(市面上的所谓介绍Hibernate或者Spring的书,实质上是介绍配置Hibernate、Spring等等如何编写配置文件的书)的复杂度难过了编写程序——很多小公司为什么总是发明ORM或者IoC框架就是这个道理。

所以,动态的、脚本化的、交互的语言会在这几年突然走红,比如Ruby或者Python,甚至Lisp这种上古时代的语言都重新出山。你不是说程序需要修改吗,我直接修改源代码好了——源代码就是配置文件。

说这些是什么意思呢?其实软件的开发方式在经历一场翻天覆地的变化,那就是程序设计语言已经发展到可以随心所欲地表达程序员意图的程度了。而设计模式也好、重构也好,它们的本质是为了当时软件开发的需要——在那个时候软件生产效率低下,设计和编码是分开的——似乎架构师负责那些“宏观”的设计,程序员负责将设计细化成代码。设计模式的本质是为了避免设计的改动造成代码的重写。所谓重构就是根据代码优化设计。而现在的主流已经淡化了设计和编码的界限。设计就是编码,编码就是设计。程序中没有那些为了实现设计意图而出现的硬编码,程序代码本身既是体现架构师设计意图的说明也是直接可以运行的程序。这是设计模式消亡的根本原因。

以前一个典型的项目组可能是这样的,一个“架构师”+10个程序员。现在架构师自己就能操纵整个程序,程序员呢,下岗了。当然你也可以说,现在的程序员必须懂得架构设计,否则它会在和工具改良的竞争中被淘汰。这就好比以前蒸汽火车的司机一般要3~4个人组成,两个人添煤,一个人看信号,一个人驾驶。后来换成内燃机车,变成两个人,一个人看信号,一个人驾驶。后来的电气火车实现了计算机自动控制,那个看信号的也不需要,只需要一个人驾驶了一样。
------其他解决方案--------------------
如果有人拿着代码,或者说基于代码来说什么设计模式,
那我很难有耐心讨论如何设计,
即便一个人同时扮演多个角色,也要时刻分清楚自己处于哪个工序;

学习软件设计不能站在程序员的角度,
走到别的任何一个行业去看看设计,都比软件设计来的成熟,都能从中汲取到大量的经验,
比如动画设计(比如:故事本,原画,动画),服装设计(比如:设计,制版,打样);

微软这种技术大腕挂着各种大小新技术走秀的时候,程序员只会照葫芦画瓢的在代码中使用这些技术,
而设计师的眼光截然不同,他们看到.net就能想到MVC,看到DSR,就能想到RuntimeAssembly,这样的设计思路没有一个和具体的代码相关,
当设计师开出工单,程序员哪怕用最笨拙的语句去实现,他们也是实现一个高级的设计
------其他解决方案--------------------
引用:
确实,设计模式只是前人的经验总结,学习他就是照葫芦画瓢,但是你能学达芬奇画鸡蛋没有任何意义吗?

达芬奇画鸡蛋有用的话,全世界都是达芬奇,
你去看看动画设计,最有技术含量的是storyBook,就是我说的故事本,
那个工序不需要你是个画家,甚至不需要你会画动画,
你只要具备最基本的绘画技能,就能表达你的设计思想,
这就是设计文档接口,以后,原画,动画,修形,上色,布景...等等工序都遵从这个接口
------其他解决方案--------------------
引用:
引用:
引用:
确实,设计模式只是前人的经验总结,学习他就是照葫芦画瓢,但是你能学达芬奇画鸡蛋没有任何意义吗?
达芬奇画鸡蛋有用的话,全世界都是达芬奇,
你去看看动画设计,最有技术含量的是storyBook,就是我说的故事本,
那个工序不需要你是个画家,甚至不需要你会画动画,
你只要具备最基本的绘画技能,就能表……

你应该学一种主流的程序设计语言。对于C#来说,C# 4可以部分满足这样的要求。当然,我觉得Python、Ruby或者用这些语言创建的DSL更好一些。

如果在10年前,也许你不得不学UML,因为那时很难找到一种可以抽象到忽略所有细节直接表达用途的编程语言。
------其他解决方案--------------------
张三丰问张无忌“你明白了多少?“

张无忌学“我忘了一多半”

其实设计模式就得这么学,忘的越快越好。心里只需要记得那七个“设计原则”就好了,其他的你能忘多快就忘多快把
------其他解决方案--------------------
所谓设计模式,就是人肉展开高级语言成低级语言的形式。

所以C#几乎用不到设计模式。大部分设计模式已经蜕变成正常书写的代码了。
------其他解决方案--------------------
我也很喜欢这本书。。很通俗。。很好玩。
------其他解决方案--------------------
我附带解释一下我1楼的回复

千万别把我1楼说的当“无招胜有招”,这会被人批为“还没学招就直接奔无招”了

我1楼所说真正的含义是要把设计原则当招,而不是把招当设计原则
------其他解决方案--------------------
策略模式就是一个典型的C#不需要的模式。因为C#支持委托,更进一步,C@支持匿名委托、Lambda表达式。

如果你看到这样一行C#代码
var query = data.Where(x => x.id == 1).SingleOrDefault();
我告诉你这就是策略模式,你不要感到吃惊。

这个代码转化为C# 1.0需要这样展开:
SomeType query = data.Where(new ADelegate(querymethod)).SingleDefault();