设计模式,是否真的适合于我

来源:互联网 发布:linux怎么安装软件.tgz 编辑:程序博客网 时间:2024/05/01 19:02
 

设计模式,是否真的适合于我

刘展辰

2008-11-04

 

最近遇到一些刚毕业的程序员和我讨论该怎么学习编程,其间很多人都会说到正在学习设计模式,或者说正在准备学习。无一例外,我都建议他们暂时不要学习,在工作半年到一年之后在学习。

虽然《设计模式:可复用面向对象软件的基础》这本书出版已经快20年了,但设计模式这一术语却变得越来越流行起来。在软件开发领域,大家都会不时地谈到这个词,大有不懂设计模式就不是搞软件的人之势。那么,是不是什么人都要学习设计模式,什么项目都应该使用设计模式呢?我看未必。

一、并不是设计模式适合所有人

       1970年,亚历山大写了一本汇集很多建筑设计模式的书,旨在提供一些能够在今后的设计中能够直接使用的设计模版。1987年,Erich Gamma在他的苏黎世大学博士毕业论文中开始尝试把这种思想改写为适用于软件开发。1991Erich Gamma 得到了博士学位,然后去了美国,在那与Richard Helm, Ralph Johnson ,John Vlissides 合作出版了Design Patterns - Elements of Reusable Object-Oriented Software 一书,在此书中共收录了23个设计模式。

       从以上设计模式的诞生过程可以看出,设计模式是一些大师潜心研究的成果。要真正读懂设计模式,需要具备面向对象领域的诸多基础知识、同时也需要对虚拟、多态、继承与封装等面向对象的设计技术有比较深刻的理解。记得曾经看到过侯捷老师说的一句话(现在找不到了),大意是这样的:100个人读了设计模式都会说好,但其中有98个人是人云亦云的,根本就没有看懂;1个人看得似懂非懂;只有另外一个人真正看懂了。由此可以看出设计模式的深度。

       所以,设计模式并不适合所有人。如果你在面向对象变成方面没有达到一定的层次,或者很少参与一些较大的实际项目,不能深刻理解在C++或其他面向对象语言中的虚拟、多态、虚基类(接口)等语法元素的实际意义,那么,你还是暂时不要学习。

二、并不是设计模式适合所有项目

       设计模式的副标题是“可复用面向对象软件的基础”。但是,设计模式除了能用于克服用软件的开发,同样,设计模式也有利于改善我们的代码结构。所以、我们不能将设计模式局限于只在将来可能服用的软件中使用。但同样,也没有必要在什么项目中、都去想方设法使用一些模式。设计模式的核心思想是对抽象编程、封装变化。那么,如果我们的软件注定就不会有变化(比如做一个一次性使用的数据转换工具),就不一定非要用到设计模式不可。

       按照敏捷开发的观点,只有在变化真正发生时,我们才应该去优化我们的代码结构。从而,在同类型的变化再次发生时,我们的代码能够很好的适应这一变化。其中很重要的一点是变化实实在在的发生了,而不是我们凭空想出来的。

比如,我们需要编写一个模块来读取一个磁盘文件,如果需要做到很好的话,我们就会考虑这个文件将来可能内存中,或者保存在网络上的某台计算机上,甚至保存在网络上很多机器机组成的分布式系统上。为了适应这种变化,我们就有必要对软件进行很多层的抽象,并尽量使用设计模式来提高软件的可服用性和可维护性。可事实上,在绝大多数情况下,我们的文件仅仅是一个磁盘文件。

三、设计模式,我们到底应该学习什么

       设计模式是指对以往一些项目中的优秀设计的总结。在《设计模式:可复用面向对象软件的基础》这本书中,作者总结了在以往的一些软件设计中用到的23种模式。在和一些软件开发人员交流时,有人经常会说到他学了几种模式。我认为,学习设计模式,并不是了解了这23种模式就完事了,我们要学习的是这种思想和解决问题的方法。按照设计模式的定义可以认为:设计模式远不止23种,我们还可以自己挖掘更多地模式。

在《敏捷软件开发》一书中,用了较大的篇幅来阐述面向对象设计的一些原则。设计模式和这些原则恰好形成了呼应。软件设计原则是一个好的软件设计的共性,是从设计模式中提取出来的一些通用原则。同时,设计模式也正是因为很好地遵循了软件设计原则,从而取得了很好的可复用性。

在我接触过的一个大型商用软件代码中,到处可以看到Factory的影子。学过设计模式的人都知道,设计模式里面的第一个模式就是抽象工厂,这些工厂隐藏了类的实力如何被创建,并在系统中扩展了相同的功能的类时,可以灵活的切换。可是,我看到的Factory中,每一个类在设计上都具备了抽象工厂类的要素,可是系统从一开始设计到最终退出市场,所有的工厂类都只是简单的封装了一个new操作符。我认为,这种为了模式而模式的做法是不可取的。

因此,在我实际学习和使用设计模式时,要从解决我们实际项目中的问题出发,结合设计模式中的思想来设计优秀的软件,而不是生搬硬套设计模式中一些现存的模式。对于一些简单设计,可以对模式进行简化(如减少一个抽象层)。而对于一些复杂的,则需要对现有的模式进行扩展,或者同时使用多个模式。

原创粉丝点击