最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

“四人帮”的设计模式经得起时间的考验么?

  • 2007-08-04
  • 本文字数:1557 字

    阅读完需:约 5 分钟

十多年前,被人称之为“四人帮(Gang of Four,GoF)”的 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 出版了他们这本划时代的著作:“设计模式:可复用面向对象软件的基础”。这本书曾被认为是整个软件模式发展的先驱,但最近却被人质疑已经与时代的发展脱节,书中解决问题的方式已经可以由新的语言来更好的处理,而且还增加了不必要的复杂度。

这一切都是由 7 月的早些时候,Jeff Atwood(Code Horror)对 GoF 的这本设计模式进行批评而引起的。Jeff 说道,虽然他认为每一个程序员都应该读一下这本书,但是他仍然认为书中存在两个很大的问题:

  1. 设计模式是复杂性的一种表现形式。我宁愿看到开发者在直接拿一张复杂的设计模式处方来用之前,先把注意力集中在寻找更简单的解决方案上。
  2. 如果你发现自己常常需要写上一大堆设计模式的样板式代码(boilerplate code)来处理“经常重现的设计问题”,那设计思路本身就是有问题的——这也是一个表示你所使用的语言的基础结构出现问题的信号。

Jeff 还在文中引用了 Mark Dominus 的话。Mark 的看法是 GoF 的设计模式一书实际上阻碍了 Christoper Alexander 等人思想的传播——他们编写了“ A Pattern Language - Towns, Buildings, Construction ”这本描述建筑架构的著作,该书被公认为激发了计算机科学领域内的设计模式运动。

Steve Rowe 也认为模式应当被作为优秀设计和原则的示例加以应用,而不是被当作一本参考书来翻阅,但是他同时也指出 Jeff 的说法是偏离主题的,因为 Jeff 指责的不是人们错误的应用设计模式的方式,而是设计模式的概念。他最后总结说,模式应当被当作优秀设计的示例,而非教条:

当我们学习设计模式发挥作用的方式来帮助我们创建相似的模式时,设计模式是好的;但是当我们直接把它们拷贝过来用时,它们就是坏的。如果有人翻开 GoF 的书,他就会发现作者常常都会为每一种设计模式都给出一些略有不同的示例。而且他或许也会发现在书中有大量的关于 OO 的讨论,这些讨论最终的结果就是模式。

Cedric Beust(Otaku)在一篇名为“为设计模式而辩(In Defense of Design Patterns)” 的文章中对 Jeff 和 Mark 的批判做出了回应。Cedric 认为 Jeff(以及在他之前的 Mark)对 GoF 一书进行批判但没有给出替代方案的做法是错误的。还有一个问题就是把 Alexander 的建筑设计模式和软件设计模式放在一个层面上比较:

很明显,我们应当把 Alexander 的设计模式和 GoF 的设计模式分离开来,其原因在于:软件工程的发展要远远落后于建筑工程。我们目前还只是处于做一些螺母和螺栓的阶段,无论什么时候启动一个新的软件项目,我们都不能保证一年之后它不会因为自身的重量而垮掉。换个视角来看,我们不妨想像一下这样一个世界:当一个建筑(比如说一座大桥)开工时,这个项目中雇用了什么样的工程师和工人,这座桥就会有什么样的未来……

Cedric 说,建筑的发展要比软件领先的多(在可预测性和稳定性方面)。我们现在还是在地基上努力奋斗,我们也应该把精力集中在这里。

Aristotle Pagaltzis 却在 Cedric 的博客上留言表示 Mark 的看法是有理有据的:

Dominus 的意思是可以把设计模式看作是一个信号,它表示了一门语言在设计模式所用来解决问题的领域内的欠缺。换句话说,在 Java 中用到的访问者(Visitor)模式就说明了 Java 在访问列表方面的不足:“Map”和“Filter”这样的语言构造不得不使用冗长的面向对象咒语才能模拟出来。 他不是像这样用设计模式不对。他只是说它们表示了语言的不足。

看上去大多数人(如果不是全部的话)都认为设计模式作为软件工程的工具是很有用处的,人们的分歧只是聚焦于 GoF 的书在今天的价值而已。你的意见是什么?你觉得 GoF 的设计模式是永不褪色的珍宝,还是已成明日黄花?

查看英文原文: Gang of Four Design Patterns - Does it stand the test of time?

2007-08-04 11:005680
用户头像

发布了 197 篇内容, 共 52.5 次阅读, 收获喜欢 20 次。

关注

评论

发布
暂无评论
发现更多内容

Android 主流通用常用框架汇总(持续更新)

android 程序员 移动开发

Android Studio 教程:入门开发第一个程序

android 程序员 移动开发

Android 中高级核心复习面试题整理,备战年后金三银四!

android 程序员 移动开发

Android SpannableString详细解析

android 程序员 移动开发

[ CloudWeGo 微服务实践 - 06 ] 服务发现(1)

baiyutang

golang 微服务 11月日更

Android Studio安装更新终极解决方式

android 程序员 移动开发

Android OpenCV(三十七):轮廓外接多边形

android 程序员 移动开发

Android P 适配指南

android 程序员 移动开发

Android WebView常见问题

android 程序员 移动开发

Android 三类框架的理解以及MVVM框架的使用

android 程序员 移动开发

android 三级级联筛选列表

android 程序员 移动开发

android 五大应用开发框架

android 程序员 移动开发

Android 图像处理

android 程序员 移动开发

【译】TypeScript的Record类型说明

废材壶

typescript

Android Studio 4

android 程序员 移动开发

Android VideoPlayer

android 程序员 移动开发

Android _ 从 Dagger2 到 Hilt 玩转依赖注入(一)

android 程序员 移动开发

android 中DrawerLayout实现抽屉

android 程序员 移动开发

Android 多渠道打包配置

android 程序员 移动开发

Android TextView的属性与应用

android 程序员 移动开发

Nebula 分布式图数据库介绍

Se7en

Android 原生控件ViewFlipper实现淘宝头条垂直滚动广告条

android 程序员 移动开发

android 图表基本属性方法设置

android 程序员 移动开发

Android SDK 网络模块解析

android 程序员 移动开发

Android Zygote 从何而来?揭开Android系统启动的面纱

android 程序员 移动开发

Android Switch控件修改样式

android 程序员 移动开发

Android UI--ViewPager扩展Tab标签指示

android 程序员 移动开发

Android View 绘制流程

android 程序员 移动开发

Android 使用讯飞语音SDK

android 程序员 移动开发

Android SDK 网络模块解析(1)

android 程序员 移动开发

Android Studio 插件

android 程序员 移动开发

“四人帮”的设计模式经得起时间的考验么?_架构_Arnon Rotem-Gal-Oz_InfoQ精选文章