《重构与模式(修订版)》—第1章1.5节重构与模式

1.5 重构与模式
重构与模式(修订版)
我观察了自己和同事们在许多项目中重构的对象和方式。在使用《重构》[F]一书中描述的许多重构方法时,我们还发现模式有助于改进设计。很多次我们都是通过重构实现模式,或者通过趋向模式进行重构,小心翼翼地避免产生过分灵活或者过度复杂的方案。

深入研究了应用“模式导向的重构”的动机之后,我发现它和“实现低层次重构”的一般动机是一样的:减少或去除重复的地方,简化复杂之处,使代码更好地表达其意图。

但是,如果只学习某个设计模式的一部分,很容易忽视这种动机。例如,《设计模式》[DP] 中的所有模式都包含一个名为“意图”的部分。《设计模式》的作者们是这样描述意图的:“意图是回答下列问题的简单陈述:设计模式是做什么的?它的基本原理和意图是什么?它解决的是什么样的特定设计问题?”[DP, 6]话虽如此,但是许多设计模式的“意图”部分只是在说明模式解决的主要问题。相反,更多的注意力放在了“模式是做什么的”之上。

我们来看两个例子。

Template Method(模板方法)的意图

定义一个操作中算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以在不改变算法结构的情况下,重定义该算法的某些特定步骤。[DP, 325]

State(状态)的意图

允许一个对象在其内部状态改变时改变自己的行为。对象看起来似乎修改了自己的类。[DP, 315]
这些意图描述并没有说明Template Method 有助于减少或者去掉类层次中各个子类里相似方法中的重复代码,也没有说明State模式有助于简化复杂的有条件的状态改变逻辑。如果程序员学习了一个设计模式的所有部分,尤其是“适用性”部分,他们将了解到该模式所要解决的问题是什么。

但是,在设计中使用《设计模式》一书时,许多程序员,包括我自己,都是通过阅读模式的“意图”部分,确定这个模式是否适合当前的情况。这种选择模式的方法的有效性不如将设计问题与模式能够解决的问题进行比对。为什么呢?因为模式之所以存在,就是为了解决问题,所以要了解在某种情况下模式是否真的有所帮助,必须理解它们有助于解决什么问题。

重构方面的文献似乎比模式方面的文献更关注具体的设计问题。开始学习某个重构时,你会在书的第一页看到重构有助于解决何种问题。本书给出的“模式导向的重构”目录直接延续了《重构》一书中所开创的工作,其目的是帮助读者了解模式有助于解决哪些具体的问题。

本书架设了模式和重构之间的桥梁,但是,其实《设计模式》一书的作者们在其皇皇巨著的“结论”一章已经提到了这两者之间的联系:

我们的设计模式记录了许多重构产生的设计结构。……设计模式为你的重构提供了目标。[DP, 354]

Martin Fowler在《重构》一书的开始也有类似的说明:

模式和重构之间存在着天然联系。模式是你想到达的目的地,而重构则是从其他地方抵达这个目的地的条条道路。[F, 107]

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-12-30 23:37:15

《重构与模式(修订版)》—第1章1.5节重构与模式的相关文章

《重构:改善既有代码的设计》—第2章2.8节重构起源何处

2.8 重构起源何处 我曾经努力想找出重构(refactoring)一词的真正起源,但最终失败了.优秀程序员肯定至少会花一些时间来清理自己的代码.这么做是因为,他们知道简洁的代码比杂乱无章的代码更容易修改,而且他们知道自己几乎无法一开始就写出简洁的代码. 重构不止如此.本书中我把重构看做整个软件开发过程的一个关键环节.最早认识重构重要性的两个人是Ward Cunningham和Kent Beck,他们早在20世纪80年代就开始使用Smalltalk,那是个特别适合重构的环境.Smalltalk是

《重构:改善既有代码的设计》—第2章2.5节重构的难题

2.5 重构的难题 学习一种可以大幅提高生产力的新技术时,你总是难以察觉其不适用的场合.通常你在一个特定场景中学习它,这个场景往往是个项目.这种情况下你很难看出什么会造成这种新技术成效不彰甚或形成危害.十年前,对象技术的情况也是如此.那时如果有人问我何时不要使用对象,我很难回答.并非我认为对象十全十美.没有局限性--我最反对这种盲目态度,而是尽管我知道它的好处,但确实不知道其局限性在哪儿. 现在,重构的处境也是如此.我们知道重构的好处,我们知道重构可以给我们的工作带来立竿见影的改变.但是我们还没

《Adobe Acrobat X中文版经典教程》—第1章1.7节在阅读模式下查看PDF文件

1.7 在阅读模式下查看PDF文件Adobe Acrobat X中文版经典教程也可在不进入全屏模式的情况下让PDF文档最大限度地利用屏幕空间,为此可使用阅读模式.除文档和菜单栏外,阅读模式隐藏工作区的其他所有元素. 1.选择菜单"视图">"阅读模式". 2.将鼠标光标移到窗口底部附近,将出现一个半透明的浮动工具栏,其中包含导航工具,让您能够缩放页面或切换到其他页面,如图1.13所示. http://write.epubit.com.cn/api/storage

《重构:改善既有代码的设计》—第1章1.2节重构的第一步

1.2 重构的第一步每当我要进行重构的时候,第一个步骤永远相同:我得为即将修改的代码建立一组可靠的测试环境.这些测试是必要的,因为尽管遵循重构手法可以使我避免绝大多数引入bug的情形,但我毕竟是人,毕竟有可能犯错.所以我需要可靠的测试. 由于statement()的运作结果是个字符串,所以我首先假设一些顾客,让他们每个人各租几部不同的影片,然后产生报表字符串.然后我就可以拿新字符串和手上已经检查过的参考字符串做比较.我把所有测试都设置好,只要在命令行输入一条Java命令就把它们统统运行起来.运行

《QTP自动化测试权威指南(第二版)》—第1章1.5节QTP许可证模式

1.5 QTP许可证模式 QTP自动化测试权威指南(第二版) 1.QTP支持以下两种类型的许可证. 单机版许可证 并发许可证 2.单机版许可证 单机版许可证是一个节点锁定或基于机器的许可证.这个许可证仅能用在生成的那台机器上,因为QTP生成的锁定码只能针对于安装它的那台机器. 如要申请一个单机版许可证,如图1-10中所示选择"Seat license"复选按钮然后点击Next.点击之后,许可证向导会如图1-11所示.显示本机的锁定码.将锁定码记录下来然后访问https://webwar

《Adobe Acrobat DC经典教程》—第1章1.11节在阅读模式下查看PDF文件

1.11 在阅读模式下查看PDF文件你可以最大化地运用屏幕空间查看PDF文档,而不必进入全屏模式.阅读模式下,将隐藏除了文档和菜单栏之外的工作区域的其他所有元素. 1.选择View > Read Mode(阅读模式). 2.移动光标至窗口底端附近,显示结果如图1.27所示. 在页面底部出现一个浮动的工具栏.浮动工具栏不同于页面控件工具栏,它包括导览工具,可以放大.缩小.跳至不同页面,以及保存和打印文件.3.单击浮动工具栏中的Show Main Toolbar(显示主工具栏)按钮(),或者再次选择

《重构:改善既有代码的设计》—第2章2.7节重构与性能

2.7 重构与性能关于重构,有一个常被提出的问题:它对程序的性能将造成怎样的影响?为了让软件易于理解,你常会做出一些使程序运行变慢的修改.这是个重要的问题.我并不赞成为了提高设计的纯洁性而忽视性能,把希望寄托于更快的硬件身上也绝非正道.已经有很多软件因为速度太慢而被用户拒绝,日益提高的机器速度也只不过略微放宽了速度方面的限制而已.但是,换个角度说,虽然重构可能使软件运行更慢,但它也使软件的性能优化更容易.除了对性能有严格要求的实时系统,其他任何情况下"编写快速软件"的秘密就是:首先写出

《重构与模式(修订版)》—第1章1.1节过度设计

第1章 本书的写作缘由重构与模式(修订版)软件模式的伟大之处,就在于它们传达了许多有用的设计思想.所以,在学习了大量模式之后,就理应成为非常优秀的软件设计人员,不是吗?当学习.使用了几十个模式后,我也曾这样认为.模式帮助我开发灵活的框架,帮助我构建坚固.可扩展的软件系统.但是几年后,我却发现自己在模式方面的知识和使用模式的方式总是使我在工作中犯过度设计的错误. 设计技术进一步提高之后,我发现自己使用模式的方式逐渐发生了变化:我开始"通过重构实现模式.趋向模式和去除模式(refactoring t

《实现模式(修订版)》—第1章1.1节章节概览

第1章 引言 实现模式(修订版) 现在开始吧.你选中了我的书(现在它就是你的了),你也编写过代码,很可能你已经从自己的经验中建立了一套属于自己的风格. 这本书的目标是要帮助你通过代码表达自己的意图.首先,我们对编程和模式做一个概述(第2章-第4章).接下来(第5章-第8章)用一系列短文和模式,讲述了"如何用Java编写出可读的代码".如果你正在编写框架(而不是应用程序),最后一章会告诉你如何调整前面给出的建议.总而言之,本书关注的焦点是用编程技巧来增进沟通. 用代码来沟通有几个步骤.首