在谈论对《重构与模式》(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)关注我们,并与我们的编辑和其他读者朋友交流。