QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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

  • 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:005876
用户头像

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

关注

评论

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

TiDB v8.5 版本正式发布,来看看有什么惊喜吧!

TiDB 社区干货传送门

腾讯云 AI 代码助手:代码诊断应用实践

cloud studio AI应用

CST如何仿真Coverage Efficiency和Coverage Threshold

思茂信息

仿真 cst CST软件

1500道Java面试题最新整理附答案汇总

采菊东篱下

编程 计算机 java面试

流量治理架构对比:当Kmesh遇上Ambient Mesh

华为云开发者联盟

istio #云原生 流量治理 Kmesh

微众银行携手平凯星辰荣膺金融科技创新奖,共同打造纳管千台服务器的大规模数据库运维平台

PingCAP

数据库 分布式 TiDB pingCAP

从混沌到秩序:Python的依赖管理工具分析

不在线第一只蜗牛

Python

TiFlash 存算分离架构踩坑实录

TiDB 社区干货传送门

新版本/特性解读 HTAP 场景实践 7.x 实践

TiDB 优化器 | 执行计划管理及实践

TiDB 社区干货传送门

商业银行基于容器云的分布式数据库架构设计与创新实践

TiDB 社区干货传送门

如何提高测试过程效率?

老张

软件测试 质量保障 效能度量 效能 效能提升

从体系建设到深化应用,中国管理会计实现十年跃迁(下)

用友智能财务

SD-WAN在企业组网中的重要作用

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SDWAN SD-WAN国际专线

这可能是牛客网上最全面的“Java面试八股文笔记”

采菊东篱下

编程 计算机 java面试

MobPush集成指南

MobTech袤博科技

TiDB数据库region打散指南

TiDB 社区干货传送门

性能调优 管理与运维 故障排查/诊断

Redis应用—7.大Value处理方案

EquatorCoco

数据库 redis

Ollama服务怎么关掉?

测吧(北京)科技有限公司

测试

前三季度我国可数字化交付的服务进出口2.13万亿元,跨境电商进出口1.88万亿元,均创历史新高| 产业互联网观察第187期

AMT企源

产业互联网 数字经济 智能制造 低空经济

TiDB 集群安装部署相关 sudo 权限说明

TiDB 社区干货传送门

安装 & 部署

这可能是2024年看过最全最详细的Java面试八股文,备战2025,查缺补漏。

架构师之道

Java 编程 面试 计算机

普通的Java程序员,需要深究源码吗?

了不起的程序猿

Java 程序员 后端 jdk源码 架构师

2024Java开发已经炸了吗?

了不起的程序猿

后端 架构师 java程序员 java面试 Java八股文

具身智能领域,伯克利(UC Berkeley)归国四子

机器人头条

清华大学 人形机器人 具身智能

数据分析和AI丨知识图谱,AI革命中数据集成和模型构建的关键推动者

Altair RapidMiner

数据分析 知识图谱 #人工智能 altair

Java 开发者注意!限时招募产品体验官,100% 获得好礼

SoFlu-JavaAI开发助手

有奖活动 开发工具 Java. AI编程

B 站数据库负责人赵月顺:助力海内外业务增长,百套 TiDB 的选型与运维实战

PingCAP

数据库 分布式 TiDB

观测云宣布正式上架微软 Azure Marketplace

观测云

耗时一周整理的牛客网上最火Java面试八股文,面试必备

架构师之道

Java 编程 程序员 计算机

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