Sunny谈重构

标签: sunny 重构 | 发表时间:2013-12-31 08:51 | 作者:LoveLion
出处:http://blog.csdn.net

       按照软件工程大神Martin Fowler的定义, 重构就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,进而提高软件的可扩展性和可维护性。这是重构的定义,简单来说就是不改变软件的功能,优化软件设计和代码,让软件更易于扩展和维护,当然也包括易于复用。Martin Fowler等人总结出了一些常用的重构技术,将其写成了一本面向对象领域的经典著作—— 《重构:改善既有代码的设计》

 

       软件开发大师Robert C. Martin【Bob大叔】在 《程序员的职业素养》(The Clean Coder)一书中也提到 要勇于整理代码,通过整理代码让它们更易于理解,更易于修改,也更易于扩展。这样,代码的bug也会随之减少,不应该让代码劣化而视若不见。我觉得Bob大叔说的很好,这就是重构的意义。因此我常常跟学生们说, 如果想成为一名合格的面向对象开发人员,设计模式和重构是你必须要学的两项基本技能。

 

       重构和设计模式之间的关系很紧密,在Martin Fowler的《重构》一书中也提到了好几种使用设计模式来进行重构的手段。另外,还有一本书,名为 《重构与模式》(Refactoring to Patterns,个人感觉翻译为“面向模式的重构”、“模式导向重构“或”重构到模式”更合适, 微笑),作者是Joshua Kerievsky,这本书获得了第15届Jolt生产效率大奖。在这本书中提到了27种以模式为导向的重构,包括在设计中实现模式、趋向模式和去除模式。很客观地对一些设计模式进行了评价,既告诉我们如何通过设计模式来提高代码质量,又告诉我们如何在代码中去除一些不合理的模式应用。该书大部分重构方案还是实现和趋向模式的,例如将创建知识搬移到Factory、将聚集操作搬移到Visitor、用Strategy替换条件逻辑、用State替换状态改变条件语句等。每一种重构方案都提供了相应的实例,让你做一次重构的操练。当然,在读这本书之前,我建议大家还是先把设计模式好好学一下,否则里面有一些重构方案就没有办法理解了,毕竟这本书不是专门讲设计模式的。建议大家在学完设计模式之后再看这本书,既能够学到如何在实际项目中运用设计模式,又能学到如何在不同情况下选择设计模式,这本书也是我研究团队成员必读书籍之一。

 

       在Bob大叔的《程序员的职业素养》一书中提到: 当你发现修改软件不像你预想的那样简单时,你便应该改进设计,使后续修改变简单。让软件保持固定不变是危险的,如果一直不重构代码,等到最后不得不重构时,将会发现代码已经很僵化。因此,要将重构变成一种习惯,每一次在阅读代码或者检入代码时都要考虑对代码进行改善与优化。如果你希望自己的代码灵活可变,那就应该时常修改它!我觉得这就是对重构时机最好的回答。如果你发现代码太僵硬,不易于扩展(你可以扩展一下试试),特别是那些在需求文档或者客户嘴里多次提到的需要改变的地方,一定要尽量灵活,当缺少这种灵活性时,你应该马上重构。 个人觉得,衡量是否需要重构的标准就是现有设计方案或者代码是否不易扩展?复用性是否存在问题?将来是否会增加维护成本?如果存在这些问题,为了将来,应该重构,立即,马上! 微笑

 

       很多人明知设计方案或者代码有问题,却不愿意去重构,这里面也存在很多原因,我觉得很多人之所有害怕重构,最大的问题在于担心重构之后会引入新的问题,难于测试。关于这一点,Robert C. Martin和我的想法不谋而合,尽量实现重构和测试的自动化。由于重构主要还是代码级的,对应的测试也主要是单元测试,单元测试的自动化程度在所有的测试中应该是最高的,因此只要我们有一套完整的测试用例,重构之后可以对应修改少许的测试代码就可以马上实施回归测试了。我个人觉得这个问题还是可以解决的,但是对于测试代码不完善或者根本没有测试代码的项目,实现起来恐怕会比较麻烦。因此,培养良好的开发习惯很重要,建议大家有空看看 测试驱动开发(TDD)方面的资料,我相信对于所有一线开发人员还是挺有帮助的。


       当然也有人觉得重构麻烦,不愿意重构,觉得功能都没有问题了,没有必要再进行重构,担心重构之后的功能会出现问题。有这种想法的人缺乏一种专业精神, 我个人觉得要想成为一名专业的程序员,应该掌握一些常用的重构技巧并经常在项目开发中使用它们,可能开始会比较麻烦一点,但是当重构成为你开发技能一部分,就像写for、if语句一样很平常,你就不会觉得这是一种麻烦。在现在主流的IDE,例如Eclipse、Visual Studio中,重构都已成为菜单的一部分,可见业界对于重构已达成共识,很多人把重构当做写注释一样,是一个很平常的提高代码质量的操作而已。


       还有一个影响重构的因素是项目进度、成本等受到制约。明明知道要重构,但是项目工期很短,没有时间和精力来重构,各种赶工很常见,后果有时候也很严重,代码质量很差,在维护和二次开发时大量代码可能需要推倒重写。对于这个问题,只能尽量去跟客户或者领导们交涉了,建议适当延长时间或者缩减功能。 如果交涉失败确实很麻烦,只能想办法记录一下哪些地方需要重构,存在哪些问题,寄希望于有时间能够把这些地方重构一下或者在维护阶段再进行重构。

 

       个人建议, 将重构当做一种习惯,发现有需要时就应该立即重构

 

       【Sunny的研究团队正在做一些更智能、操作更简单的自动化代码重构工具的研发工作,期待在不久的将来能够为广大软件开发人员带来一款Free & Valuable的自动重构工具! 微笑也欢迎大家提出宝贵的意见和建议!】


Sunny在2014年将浓情推出系列文章:【代码七十二变】,详细介绍72种实用的代码重构技术,既有《重构》和《重构与模式》中的一些经典重构手段,也有Sunny在多年开发中常用的一些代码重构技巧,敬请期待!

 

【作者:刘伟 http://blog.csdn.net/lovelion

作者:LoveLion 发表于2013-12-31 0:51:29 原文链接
阅读:262 评论:1 查看评论

相关 [sunny 重构] 推荐:

Sunny谈重构

- - CSDN博客架构设计推荐文章
       按照软件工程大神Martin Fowler的定义, 重构就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,进而提高软件的可扩展性和可维护性. 这是重构的定义,简单来说就是不改变软件的功能,优化软件设计和代码,让软件更易于扩展和维护,当然也包括易于复用.

代码重构

- - ITeye博客
随着程序的演化,我们有必要重新思考早先的决策,并重写部分代码. 代码需要演化;它不是静态的事物. 重写、重做和重新架构代码合起来,称为重构.    当你遇到绊脚石  ---  代码不在合适,你注意到有两样东西其实应该合并或是其他任何对你来说是"错误"的东西  -------- . 如果代码具备以下特征,你都应该考虑重构代码:.

代码重构总结

- - 开源软件 - ITeye博客
重构:对软件内部结构的一种调整,目的是在不改变软件之可察行为前提下,提高其理解性,降低其修改成本. 创建一个新方法,命名以它做什么来命名,而不是怎么做来命名. 如果只是简单的委托,可以将方法内联. 被子类继承的方法不能内联. 如果一个临时变量只被简单的表达式赋值一次,就可以将它内联. 将这个临时变量申明为final.

代码坏味道——重构

- - CSDN博客推荐文章
1.    Duplicated Code(重复的代码). 臭味行列中首当其冲的就是Duplicated Code. 如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更好. 最单纯的Duplicated Code就是[同一个class内的两个函数含有相同表达式(expression)].

【外刊IT评论网】什么是重构,什么不是重构

- - 外刊IT评论网
  有时候,会有程序员跑到我这里说他们不喜欢某个东西的设计,“我们需要给它来个全面的重构”,来纠正里面的错误.   重构(Refactoring)这个词最初由Martin Fowler 和 Kent Beck给下的定义,它是. 一种修改,使软件的内部结构更容易理解,在不改变软件的可见行为方式前提下使软件更容易变更…它是一种有节制的整理代码、使bug产生几率最小化的方法.

重构代码的7个阶段

- 风子 - 酷壳 - CoolShell.cn
你曾去想重构一个很老的模块,但是你只看了一眼你就恶心极了. 文档,奇怪的函数和类的命名,等等,整个模块就像一个带着脚镣的衣衫褴褛的人,虽然能走,但是其已经让人感到很不舒服. 面对这种情况,真正的程序员会是不会认输的,他们会接受挑战认真分析,那怕重写也在所不惜. 最终那个模块会被他们重构,就像以前和大家介绍过的那些令人销魂的编程方式中的屠宰式编程一样.

用Mikado方法重构遗留软件

- - InfoQ cn
在敏捷印度2012的一次研讨会上, Daniel Brolund介绍了 Mikado方法. 此方法主张敏捷团队在面临低质的遗留代码时,采用简单的方法,分成小部分逐步完成重构. 通常,当你想在遗留应用程序中做个简单的改动时,经常会有某些事情出错而使这个改动无法执行——如编译出错、验收测试失败(如果有验收测试.

重构时应避免过度思考

- - InfoQ cn
重构是一门在不改变软件外部行为情况下,改善既有代码内部结构的一门技术. 从表面来看,重构需要引入大量的思考行为,然而,过度地思考同样会产生不利的影响. Kent Beck提到,重构中面临 最大的挑战就是如何做到循序渐进,循序渐进指的是如何将工作分解为可控的步骤,并且每个步骤都易于管理. 重构步伐过快会导致不稳定代码的出现.

代码重构方向原则指导

- - 外刊IT评论
提示:如果您在阅读器里点击订阅本站的文章链接时发现有一个中转页,这说明你的订阅地址有误,本站的订阅地址(RSS)是:. http://www.aqee.net/feed/,请及时纠正. 重构是一种对软件进行修改的行为,但它并不改变软件的功能特征,而是通过让软件程序更清晰,更简洁和更条理来改进软件的质量.

代码重构:HTML与语义化

- - 标点符
在前端开发过程中,很多人谈到“模块化”,很少人特别关注“语义化”,简单的说大多数人更关注功能的实现,而忽视了实现的细节. 所谓HTML语义化,就是尽可能的理解要表达的内容,选择适合的HTML标签,将内容转换成浏览器认识的语言,通过浏览器传达信息给用户. 目前很多的前端书籍取名就叫精通DIV+CSS,让人感觉DIV可以搞定一切,但是DIV标签仅代表一个块状标记,HTML的每个标签都有它特定的意义,而语义化就是让我们在适当的位置用适当的标签,以更好的让人和机器(机器可理解为浏览器可理解为搜索引擎)都一目了然.