生成式AI领域的最新成果都在这里!抢 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:005672
用户头像

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

关注

评论

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

AlmaLinux安装OpenVINO

IT蜗壳-Tango

IT蜗壳 OpenVINO 11月日更

[Pulsar] 使用Proxy进行认证和鉴权

Zike Yang

Apache Pulsar 11月日更

Moment.js 如何获得当前时间的零时时间

HoneyMoose

零拷贝原理的文章网上满天飞,但你知道如何使用零拷贝吗?

中间件兴趣圈

Netty 零拷贝 11月日更

助力政企自动化自然生长,华为WeAutomate RPA是怎么做到的?

王吉伟频道

华为 RPA WeAutomate 政企 超自动化

linux之抓包神器tcpdump

入门小站

Linux

【LeetCode】K 个一组翻转链表Java题解

Albert

算法 LeetCode 11月日更

JavaScript 的 parseInt() 函数

HoneyMoose

Apache Pulsar 与 Kafka 性能比较:延迟性(测试结果)

Apache Pulsar

kafka 云原生 Apache Pulsar 消息 延迟性

OceanBase 监控工具 OBAgent

OceanBase 数据库

数据库 开源 学习方法 分布式 oceanbase

如何优雅的获取 Mac OS 系统 IP 地址?

liuzhen007

11月日更

0711作业:MapReduce 编程作业

arctec

如何给 CloudWeGo 做贡献

baiyutang

golang 微服务 11月日更

Moment.js 如何使用 Epoch Time 来构造对象

HoneyMoose

在线等差数列项生成器

入门小站

工具

Prometheus Exporter (一)Node Exporter

耳东@Erdong

Linux Prometheus exporter 11月日更 Node Exporter

对比 Apache Kafka 和 Apache Pulsar 创建工作队列

Apache Pulsar

kafka 分布式 中间件 Apache Pulsar 工作队列

回收与价值赋能:动力电池的“退休”之旅

脑极体

2021最新Apache漏洞分析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

NodeJs深入浅出之旅:文件系统

空城机

大前端 Node 11月日更

Mysql事务的实现原理之Redo Log的分析

卢卡多多

Redo Log 11月日更

Apache Pulsar 与 Kafka 性能比较:延迟性(测试过程)

Apache Pulsar

kafka 分布式 云原生 消息中间件 Apache Pulsar 消息系统

元宇宙和当今最活跃的三家元宇宙平台

devpoint

以太坊 元宇宙 11月日更

如何使用 MySQL 慢查询日志进行性能优化 - Profiling、mysqldumpslow 实例详解

蒋川

MySQL 数据库 MariaDB 慢查询

模块三-架构详细文档

🌾🌾🌾小麦🌾🌾🌾

架构实战营

0718作业:Hadoop RPC

arctec

云迹科技林小俊:商业服务机器人如何破局“低价+同质化”?

朋湖网

Go语言,语法糖规则,可别掉入陷阱

微客鸟窝

Go 语言 11月日更

javaScript基础篇之数组是怎样锻炼你的逻辑能力

你好bk

JavaScript 大前端 数组 数组合并

.NET6新东西--隐式命名空间引用

喵叔

11月日更

开源数据库OceanBase源码解读(九):tableAPI和OB多模型

OceanBase 数据库

数据库 开源 oceanbase

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