2019年/10月/22日

首页回退

设计模式的十大误解

最近看了《设计模式沉思录》,又是对我一次精神的洗礼,书中的观点似曾相似以前自己的直觉,因为我在大学的时候第一次看到设计模式的时候,发现人们太疯狂了,甚至有人写个helloworld都用了很多设计模式,模式运动来源于一本建筑书籍,而建筑和软件开发本身差距还是太大了。 我们完全有可能自己创造模式,抑或像张无忌那样,要忘记招式去领悟道

误解一:模式就是在一种场合下对某个问题的一个解决方案

定义术语可能只是徒劳无功,因为一个定义也许对一部分受众(比如程序员)有用,但对另一部分受众(比如掌管公司财政大权的执行官)来说却毫无意义。 当然,我也不会尝试在这里给出一个最终的定义。我只想说,任何一个规定模式的组成要素的定义,除了要讨论问题、解决方案和场合之外,还必须涉及再现、教学以及命名。

误解二:模式只是行话、规则、编程技巧、数据结构……

来看看上面这句话。事实上的确存在一些模式行话,比如”模式”(pattern)本身、”推动力”(force)、Alexander的”无名的品质”(quality without a name),等等。 但我们很难把模式简单归纳成行话。与计算机科学中的大多数领域相比,模式几乎没有引入什么新术语。事实上这是模式的特征,一个好的模式天生就很容易为它的受众所理解。虽然模式可能会用到它所面向的目标领域的行话,但我们几乎不需要为模式定义专门的术语。

模式不是可以盲目应用的规则(否则有悖于模式的教学特性)。模式也不仅仅是编程技巧,虽说”惯用法”关注的是与特定的编程语言有关的模式。”技巧”在我听起来有些贬义,它过分强调了解决方案,而忽略了问题、场合、教学以及命名。

误解三:看到了冰山的一角,就等于看到了冰山的全部

以偏盖全不是一种正当的做法,如果用这种方式来看待模式,那就大错特错了。模式所涉及的领域、内容、范畴和风格非常广泛,而且它们的质量也千差万别。只要随便翻阅Pattern Languages of Program Design 丛书中的一本,就可以感受到这一点。模式和编写模式的人一样多样,也许有过之而无不及。 随便举几个例子,Alistair Cockburn、Jim Coplien、Neil Harrison以及Ralph Johnson等,虽然这些作者一开始也曾尝试用多种风格来为不同领域编写模式,但是现在他们早已经超越了这个阶段。因此,仅仅通过少数几个例子就对模式下一个笼统的结论是错误的。

误解四:模式需要工具或方法的支持才能生效

当我在谈论这个话题的时候,我通常会指出模式的4个主要优点。

  1. 它们提炼出专家的经验和智慧,为普通开发人员所用。
  2. 它们的名字组成了一个词汇表,有助于开发人员更好地交流。
  3. 系统的文档若记载了该系统所使用的模式,则有助于人们更快地理解系统。
  4. 它们使得对系统进行改造变得更加容易,无论系统原来的设计是否采用了模式。

简而言之,模式是供大脑消化吸收的食粮,而不是供工具加工的材料。方法论和自动化的支持对模式可能会有好处,但我相信这些都只是锦上添花的东西而已

误解五:模式可以保证可复用的软件、更高的生产率、世界和平,等等。

这个误解很容易批驳,因为模式并没有保证任何东西。它们甚至不能增加从中获取益处的可能性。模式并不能代替人来完成创造,它们只不过给那些缺乏经验但却具备才能和创造力的人带来了希望。 人们说到好的模式,会有恍然大悟之感。只有当模式能够触动心弦时,这种情况才会发生。如果模式无法触动心弦,那么它就像人迹罕至的森林中的一棵大树,纵使轰然倒下也没有人能听到它的声音。模式也是如此:即便它编写得再好,如果不能引起人们的共鸣,那么它好在哪里呢? 模式只不过是开发人员军火库中的另一件武器。将太多东西都归功于模式只能适得其反。要防止夸大其词的宣扬引发抵触情绪,最好的方法就是–少说多做。

误解六:模式可以’产生’整体架构

模式不可能涵盖架构的方方面面。给我看一个稍有规模的设计,我一定能发现既有模式尚未涉及的许多设计问题。也许这些问题不常见或不经常发生,或者只不过它们尚未被编写成模式的形式。但无论如何,我们需要运用自己的创造力来填补各种现有模式之间的空白地带

误解七:模式是用于(面向对象的)设计或实现的

如果模式不能把专家的经验记录下来,那么它们就一无是处。究竟记录哪些经验则由模式的编写者决定。在面向对象的软件设计中,当然有值得记录的经验,但在非面向对象的设计中,同样有值得记录的经验。不仅在设计领域有值得记录的经验,而且在分析、维护、测试、文档、组织结构等领域都有值得记录的经验。这些不同领域中的模式正在浮现。 目前在分析模式领域,已经至少出版了两本书,而且每一届的PLoP会议都会吸引一些新型的模式。(提交给1996年会议的一个模式特别有意思,它是关于音乐作曲的模式!) 显然,没有任何一种模式能够适用于所有领域。唯一能够适用于任何领域的是一个通用的概念–无论在什么领域,模式都是一种用来记录和传播专家经验的工具

误解八:没有证据表明模式对任何人有帮助

随着时间的推移,我们会更加清楚使用模式所带来的好处和隐患。即使最初的反馈非常好,我们仍然需要积累更多的经验,这样才能得到一个更加全面的评估。但是,如果仅仅因为模式所带来的好处还没有被完全量化就拒绝马上开始使用模式,那绝对是很愚蠢的行为。

误解九:模式社区是一个由精英分子组成的小帮派

模式社区里常常有著作发表,但社区中有学术背景的人相对来说却并不多,对此有人可能会感到不解。事实上,PLoP的大多数与会者都是软件行业的从业人员,而且似乎一直以来都是这样。 软件模式的早期拥护者们–包括Kent Beck、Peter Coad以及Ward Cunningham–没有一个是来自学术界的。GoF中只有一个(Ralph)来自学术界,而且他是我所见过的最讲究实用性的学者。模式社区的草根本质显然与那些所谓的同种论(homogeneity)和精英论是背道而驰的。

误解十:模式社区是为自己服务的,甚至是不怀好意的

现在模式已经成为了一个重要的术语,因此有些人想利用它来谋取一些私利也在所难免。但是,如果仔细地阅读那些模式领军人物编写的作品,你就会感受到其中共同的宗旨:将来之不易的专家经验、最佳实践,甚至是竞争优势–多年亲身实践所积累的经验硕果–不仅展露出来而且传授给所有后来者。 正是这种要提升所有读者的软件设计能力的热情,激励着每一位真诚而富有成效的模式编写者。缺少任何一项因素,那只能是适得其反,并最终导致对模式的误解