点击围观!腾讯 TAPD 助力金融行业研发提效、敏捷转型最佳实践! 了解详情
写点什么

阅读者 (二十二): 从重构到模式

  • 2012-09-28
  • 本文字数:2120 字

    阅读完需:约 7 分钟

在谈论对《重构与模式》(Refactoring to Pattern)一书的认识之前,我想谈两点作为一个有近四年工作经验的软件从业人员在面向对象领域的一些困惑:

  • 重构的困惑:随着重构技巧的不断实践,诸如重命名、提取函数、搬移函数、内联、改变函数参数等技巧已经掌握得很熟练,然而一些困惑也开始出现。经过长期实践发现,我能使用重构所做的改善基本停留在类的内部,很容易地处理一些常见的坏味道,但是很难上升到类与类之间这个层次。一旦上升到这个层次,思路变得不清晰,把控能力明显下降。我也曾跟一些同事交流,与我有差不多经验的同事都有类似的困惑。
  • 模式的困惑:读完《设计模式》以及《深入浅出设计模式》之后,了解了很多模式框架,进而知道了很多解决一些典型问题的最佳方案。但是应用起来只会照搬照套,很难做到恰到好处。甚至某些时候适得其反,引入一些不必要的复杂性。更糟糕的是,一旦学会一些模式之后,非常容易滥用。有些时候为了显示自己对模式的把握技高一筹,在代码中恨不得“无处不模式”。后来逐渐发现模式这个工具不是万能的,如果用错只会让代码变得奇怪,甚至不可理解。因而,如何恰到好处地运用模式一直困扰着我。

当我读完《重构与模式》的前言时,立即意识到此书是我寻觅良久的作品。因为作者开门见山地道明了本书的主旨,即将重构与模式结合,使用模式来改善既有设计。如果你也认为模式是对面向对象设计在特定问题域的最佳实践,那么使用它来构建类结构岂不是高屋建瓴?当然,在前言的“此书目的”中也清晰明了地指出了如何才能将重构与模式很好的结合,那就是使用“模式导向的重构改善既有代码设计”。

纵观整本书,结构十分清晰。首先回顾了重构和模式的基本概念,当然它们是本书的基石,同时给那些对于重构和模式缺乏了解的读者一个熟悉它们的机会。接着谈到了代码的坏味道,这也是很有必要的。如果都不清楚什么样的代码是不好的,改善就无从谈起,因为代码的坏味道是重构的起点。最后是本书的精髓,所谓的“干货”部分,即授予读者如何将模式与重构结合的利器。通过代码实例,结合前面提到的坏味道,讲解每种重构技法的具体操作步骤。

任何一本书的结构设计与章节组织,其作者往往基于少量因素考虑,无法兼顾广大读者的需求。鉴于本书的实际操作性极强,作者很贴心地从读者学习的角度出发,考虑实例间对同一个项目的引用关系,在第五章最后部分给出了一个学习这些重构技法的推荐顺序列表(表 5-1)。具体到每个重构技巧的介绍模式跟 Martin Folower《重构》一书基本类似,所以对于熟悉 Martin 著作的读者来说,读这本书有种似曾相识的感觉,很容易上手。从第六章开始都采用了如下组织结构:

  • 名称
  • 概要
  • 动机
  • 做法
  • 示例
  • 变体

我认为最有价值的是动机和做法这两部分,因为每个重构技法的理论指导都在这里了。特别是在动机部分,作者给出了此重构技法的优缺点。哲学的基本原理告诉我们任何事物都有两面性。有利有弊,给读者决定采用此重构方法时提供了具体的考量标准。

此外,在第四章《代码坏味》中,作者给出了一个表(表 4-1)。此表列出了本书处理的 12 种代码坏味的 27 种重构手法。我想它的最大作用在于,当你日后遇到某种代码坏味而忘记重构方法时,可以充当一个快速查阅工具。同时,本章还针对每种坏味言简意赅地说明了它的定义以及带来的危害,并且给出了解决它的重构方法。

至于每个具体的重构技法,我认为最佳学习实践是根据表 5-1 建立工程项目,把每个重构技法按照作者的指示实际动手实践。强烈推荐使用 Intellij Idea 来操作,因为它提供了很好的重构功能。例如,作者在第十一章提到的几个重构方法,就可以选中需要重构的代码块,使用几个快捷键立马可以搞定。具体的说,比如提取参数,只需要选中需要提取为参数的变量,Ctrl+Alt+P,重构结束,所有调用此方法的地方都自动将参数值传入。当然,工具虽然能节约敲代码的时间,并保证正确性,但还是需要认真阅读作者所写的每个步骤,深入理解背后的原理。

本书的好我不需要再画蛇添足地说太多,因为推荐此书那些大牛们的华丽言辞已经无以复加。如果还是太抽象,我将给本书作序的软件行业泰斗,ThoughtWorks 首席科学家——Martin Folower 的赞誉摘抄如下:

正因为如此,如果说有什么人最合适写模式与重构之间的联系,那应该非 Joshua 莫属了。

个人觉得本书略显不足之处在于其中文译名,有点错失原作者的主要意图了。Refactoring to Pattens 的目的在于使用重构工具,以模式为导向来改善既有代码设计。如果按照中文译名理解,感觉只是介绍重构和模式而已,没能体现上述意图。

无论如何,本书是一本难得的理论与实践兼顾的作品,对于掌握和深入理解模式导向的重构有非常实用的指导意义。

个人介绍

张岳,ThoughtWorks 咨询师。擅长面向对象设计与编程,对敏捷开发与实践有丰富经验,关注互联网及移动平台新技术。主要项目经验在于开发、部署和运维企业级 Web 系统,数据整合与分析,以及企业级系统集成。主要熟悉的平台有 Java、.NET;经常使用的语言有 Java、C#、Ruby、JavaScript 等等。


感谢贾国清对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-09-28 00:005198

评论

发布
暂无评论
  • 实用的软件架构方法

    软件架构就是软件的基本结构,它是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。

  • 领域特定语言

    本书是DSL领域的丰碑之作,由世界级软件开发大师和软件开发“教父”Martin Fowler历时多年写作而成,ThoughtWorks中国翻译。全面详尽地讲解了各种DSL及其构造方式,揭示了与编程语言无关的通用原则和模式,阐释了如何通过DSL有效提高开发人员的生产力以及增进与领域专家的有效沟通,能为开发人员选择和使用DSL提供有效的决策依据和指导方法。

  • 本周总结

    本周讲的模式与重构,以junit为例讲了策略模式+模板模式、装饰模式和组合模式的应用,下面就分别陈述一下这几种模式应用场景、角色分工以及他们如何协作以更简洁的清晰的代码实现更强大的功能。

    2020-06-24

  • InfoQ 中文站翻译之作《实现模式》中文版面市

    《实现模式》中文版近日已经面市。该书的作者为Kent Beck,JUnit测试框架创始人,《测试驱动开发》和《解析极限编程》的作者,软件业中最具创新力,最富盛名的领袖之一。在这本书中,Kent Beck将自己多年形成的编程习惯以及阅读既有代码的体验凝练成了编程中的价值观、原则和77种实现模式,帮助人们写出更加简洁、清晰、组织良好且具有更佳有效产出的代码。本书由InfoQ中文站翻译完成。

  • 加餐 3|这些书里,藏着高手们的“不传之秘”

    虽然春节长假转瞬即逝,但今天我们还是给春节策划收个尾,继续说说能帮你落地 DDD 的相关图书。

    2023-01-28

  • 模式与重构

    面向对象编程的目标: 构造强内聚, 低耦合的程序, 从而让程序易于扩展 和 维护 。

    2020-06-21

  • 加餐二 | 设计模式、重构、编程规范等相关书籍推荐

    如果你想要学好设计模式,肯定是要看书的。我结合自己的经验,为你打造了一份读书单,配合专栏一块儿学,效果会更好!

    2019-12-01

  • 文章:揭示常见的重构误区

    相对于Java,.NET在持续重构方面所给与的重视仍然少为人知。除了很少的狂热支持者,整体而言,大多数人对于重构是否真正属于开发过程,以及如何将其应用到开发过程中持观望态度。Professional Refactoring in Visual Basic一书的作者Danijel Arsenovski,试图揭示这些谜题。<a href="http://www.infoq.com/cn/articles/RefactoringMyths" target="_blank">直接点击阅读完整文章</a>。

  • 谈 C++17 里的 Builder 模式

    已经写了一篇 谈 C++17 里的 Factory 模式 ,后来又顺便肝了一篇 谈 C++17 里的 Singleton 模式 。看来是得要整一大堆了,对于懒散的人来说这很麻烦。我不知道是不是要打算会写完整个 GoF 的个人理解以及新的的实现,慢慢看吧,做了就做了。

    2021-09-05

  • 面试题精选

    2020-12-24

  • 揭示常见的重构误区

    相对于Java,.NET在持续重构方面所给与的重视仍然少为人知。除了很少的狂热支持者,整体而言,大多数人对于重构是否真正属于开发过程,以及如何将其应用到开发过程中持观望态度。Professional Refactoring in Visual Basic一书的作者Danijel Arsenovski,试图揭示这些谜题。

  • BDD

    2019-04-01

  • 演讲中的肢体语言管理和声音控制有哪些门道?

    肢体语言和语音语调对沟通效果的影响占比高达 93%,也就是说,讲话的方式比讲话的内容重要得多。

    2017-12-03

  • 加餐 | 你真的了解重构吗?

    重构,本质上就是一堆微操作。重构这个实践的核心,就是将调整代码的动作分解成一个一个的小动作,如果不能理解这一点,你就很难理解重构本身的价值。

    2019-03-15

  • 论模式在领域驱动设计中的重要性

    最近在阿姆斯特丹举办的领域驱动设计欧洲大会上,Cyrille Martraire在其演讲中谈论到模式的重要性时表示,了解领域驱动设计之外诸多现存的模式很有必要,它们可以帮助你设计出更好的系统。

  • 重构之十六字心法(一)

    发挥其最大的威力

  • 31 天重构指南

    重构作为改进代码质量的手段,会持续运用在在软件开发过程中。八月份,Sean Chambers在博客中编写了一系列描述重构方式的文章。Sean指出,这些重构方式主要来源于Martin的重构资源站点、代码大全(第二版)以及平时由他自己收集的互联网资源,他的目的是为各种重构方式提供了一些额外的描述及相关的讨论。

  • 重构之十六字心法(二)

    软件开发的难点在于不确定性

  • 阅读者 (三):程序员的思维修炼

    Andy Hunt何许人也?作为程序员,如果你不知道,说明你忽略了程序员技能的修炼。严格意义上讲,Andy Hunt已经脱离了程序员的范畴,而是专注于修炼之道的哲人、思想家,同时,又是一位身体力行的实践者。阅读他的著作,就是在体悟他的道,他的哲学,他的实践精神。本期阅读者将分享Andy的著作《程序员的思维修炼——开发认知潜能的九堂课》,它将为你开启修炼脑力思维的全新大门。为了更全面地展现阅读者的视角,我们将从译者和读者两个角度分别探讨本书蕴含的哲学。

  • JavaScript 应用设计模式

    Carl Danley撰写了一系列关于JavaScript设计模式的文章,描述了每个模式的用途、主要的用例以及其优缺点,并为每个模式都编写了一个小型例程。这些文章覆盖了模块模式、揭示模块模式、单例模式、观察者模式、中介模式、原型模式和外观模式。

发现更多内容

MyBatis3源码解析(5)查询结果处理

Java mybatis

MyBatis3源码解析(7)TypeHandler注册与获取

Java mybatis

前端技术分享:页面性能优化问题复盘

有道技术团队

前端

MyBatis3源码解析(8)MyBatis与Spring的结合

Java mybatis

MyBatis Demo 编写(1)基础功能搭建

Java mybatis

TcaplusDB君 · 行业新闻汇编(五)

tcaplus

java培训:JVM 锁的优化和逃逸分析

@零度

JVM JAVA开发

HTTP缓存协议实战

vivo互联网技术

缓存 浏览器 服务器 HTTP

MyBatis3源码解析(6)TypeHandler使用

Java mybatis

Linux系统编程-进程间通信(共享内存)

DS小龙哥

Linux 共享内存 2月月更

设计模式【15】--从审批流中学习责任链模式

秦怀杂货店

Java 设计模式

国内首款! 亚信科技数据库AntDB亮相中国信通院性能测试工具发布会

亚信AntDB数据库

开源demo| 你画我猜——让你的生活更有趣

anyRTC开发者

音视频 互动白板 开源demo 你画我猜 社交娱乐

Mybatis3 源码解析系列

Java mybatis

如何选择充血模型和贫血模型

蜜糖的代码注释

DDD 领域建模 2月月更

TcaplusDB君 · 行业新闻汇编(六)

tcaplus

MyBatis3源码解析(3)查询语句执行

Java mybatis

MyBatis Demo 编写(2)结果映射转换处理

Java mybatis

【高并发】深入解析Callable接口

冰河

Java 并发编程 多线程 高并发 异步编程

启发式智能任务调度的探索

鲸品堂

算法 函数 任务调度

TcaplusDB君 · 行业新闻汇编(三)

tcaplus

大数据培训:Flink全链路延迟的测量方式及原理

@零度

flink 大数据开发

文本检测算法新思路:基于区域重组的文本检测

华为云开发者联盟

文本检测 区域重组 文本检测算法 PixelLink TextSnake

服务网格 ASM 年终总结:最终用户如何使用服务网格?

阿里巴巴云原生

阿里云 云原生 服务网格 容器服务

MyBatis3源码解析(2)数据库连接

Java mybatis

Kubernetes集群统一日志管理方案(Elasticsearch+Filebeat+Kibana+Metricbeat)搭建教程

山河已无恙

Kubernetes 2月月更

MyBatis3源码解析(4)参数解析

Java mybatis

web前端培训: Vue3面试考点分享

@零度

前端开发 Vue3

翟佳:从技术工程师到「网红」开源创业者

腾源会

开源 开源公司

架构训练营模块二作业

苍狼

作业 模块二 架构训练营5期

与Karmada一起航行:海量节点的多集群管理

华为云原生团队

容器 云原生 k8s k8s多集群管理 多云管理

阅读者(二十二):从重构到模式_重构_张岳_InfoQ精选文章