1.什么是重构

重构(Refactoring):在不改变软件的功能和外部可见性的情况下,为了改善软件的结构,提高清晰性、可扩展性和可重用性而对软件进行的改造,对代码内部的结构进行优化。

2.为何重构

1)改进软件设计(整理代码)

重构和设计是相辅相成的,它和设计彼此互补。有了重构,你仍然必须做预先的设计,但是不必是最优的设计,只需要一个合理的解决方案就够了,如果没有重构、程序设计会逐渐腐败变质,愈来愈像断线的风筝,脱缰的野马无法控制。重构其实就是整理代码,让所有带着发散倾向的代码回归本位。

2)提高代码质量和可读性,使软件系统更易理解和维护

"任何一个傻瓜都能写出计算机可以理解的程序,只有写出人类容易理解的程序才是优秀的程序员"。有些程序员总是能够快速编写出可运行的代码,但代码中晦涩的命名使人晕眩得需要紧握坐椅扶手,试想一个新兵到来接手这样的代码他会不会想当逃兵呢?

软件的生命周期往往需要多批程序员来维护,我们往往忽略了这些后来人。为了使代码容易被他人理解,需要在实现软件功能时做许多额外的事件,如清晰的排版布局,简明扼要的注释,其中命名也是一个重要的方面。一个很好的办法就是采用暗喻命名,即以对象实现的功能的依据,用形象化或拟人化的手法进行命名,一个很好的态度就是将每个代码元素像新生儿一样命名,也许笔者有点命名偏执狂的倾向,如能荣此雅号,将深以此为幸。

对于那些让人充满迷茫感甚至误导性的命名,需要果决地、大刀阔斧地整容,永远不要手下留情!

3)帮助尽早的发现错误(Defects)

孔子说过:温故而知新。重构代码时逼迫你加深理解原先所写的代码。程序员经常对自己的程序逻辑不甚理解的情景,曾为此惊悚过,后来发现这种症状居然是许多程序员常患的"感冒"。当你也发生这样的情形时,通过重构代码可以加深对原设计的理解,发现其中的问题和隐患,构建出更好的代码。

4)提高编程速度

良好设计是维持软件开发速度的根本,重构可以帮助你更快的开发软件。因为它防止系统腐败变质。甚至还可以提高设计质量。当你发现解决一个问题变得异常复杂时,往往不是问题本身造成的,而是你用错了方法,拙劣的设计往往导致臃肿的编码。

改善设计、提高可读性、减少缺陷都是为了稳住阵脚。良好的设计是成功的一半,停下来通过重构改进设计,或许会在当前减缓速度,但它带来的后发优势却是不可低估的。

3.何时重构

1)重构应该是随时随地进行。不应该为重构而重构。
    2)三次法则:第一次做某件事只管去做;第二次做类似的事会产生反感,但无论如何还是可以去做 第三次 再做类似的事情,就应该重构了。
    3)添加功能
    4)修复bug
    5)复审代码,即Code Review时候
    重构可能会引入更多见阶层,重构往往需要把大型对象拆成多个小型对象。把大型函数拆成多个小型函数。间接层是把双刃剑:一是你需要管理多分内容。
    但间接层有以下作用:
    1)允许逻辑共享,小函数复用性高。
    2)分开解释意图和实现:可以选择类名和函数名解释实现意图的做法。
    3)隔离变化
    4)封装条件逻辑:对象有一种奇妙的机制:多态消息,可以灵活而清晰地表达条件逻辑。将条件逻辑转化为消息形式,往往能降低代码的重复。增加清晰度并提高弹性。

4.何时不该重构

1)代码是在太混乱了,设计完全错误。
    2)如果项目已近最后期限,应该避免重构。

3)重构还不如重新编码。即重构的工作量显著的影响Estimate

5.重构流程

1)读懂代码(包括测试例子代码)
2)进行重构
3)运行所有的Unit Tests 

6. 重构与设计

1)很多人都把设计看作软件开发的关键换进。而把编程看作只是机械式的低级劳动。
    2)另外的观点就是:重构可以取代预先设计。你不必要做任何设计,只管按照最初的想法开始编码,让代码运作,然后再将它重构成型。

实际上重构与设计是互补的,程序应该是先设计,而在开始编码后,设计上的不足可以用重构来弥补.设计应该是适度的设计,而不必过度的设计.如果能很容易的通过重构来适应需求的变化,那么就不必过度的设计,当需求改变时再重构代码 。

7.重构与性能

    三种快速编写软件的方法:
   1)时间预算法
在设计时就对程序花费的时间进行预算,通常用于性能要求极高的实时系统.普通的企业应用程序一般对性能要求不高.只要不太慢就可以了 。
   2) 持续关注法
要求程序员在任何时间都要设法保持系统的高性能.这个方法有个缺陷,就是大部分的程序90%的优化工作都是白费劲,这样会浪费大量的时间 。
   3) 良好的分解方式
  这个方式是在开发程序阶段不对性能投以任何关注,直到进入性能优化阶段,再分析程序中性能差的程序,然后对这些程序进分解,查出性能差的程序,进行优化。

重构-改善既有代码的设计:重构原则(二)相关推荐

  1. PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性

    思维导图 索引: Ø Move Method(搬移函数) Ø Move Field (搬移值域) Ø Extract Class (提炼类) Ø Inline Class (将类内联化,就是把当前的类 ...

  2. 重构—改善既有代码的设计

    概述 1.1 参考资料 <重构-改善既有代码的设计>读后总结 <重构改善既有代码的设计> 22种代码的坏味道,一句话概括 1.2 何谓重构 首先要说明的是:视上下文不同,重构的 ...

  3. 『重构--改善既有代码的设计』读书笔记----序

    作为C++的程序员,我从大学就开始不间断的看书,看到如今上班,也始终坚持每天多多少少阅读技术文章,书看的很多,但很难有一本书,能让我去反复的翻阅.但唯独『重构--改善既有代码的设计』这本书让我重复看了 ...

  4. PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据

    介绍 承接上文的PHP 杂谈<重构-改善既有代码的设计>之 重新组织你的函数继续重构方面的内容. 这章主要针对数据的重构. 1.争论的声音--直接访问Field还是通过函数(Accesso ...

  5. 重构 改善既有代码的设计:代码的坏

    以下内容来自<<重构 改善既有代码的设计>> 一.什么是重构 所谓重构(Refactoring)是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改以改进程序的内部结构 ...

  6. 《重构-改善既有代码的设计》-第1例:租赁影片(2)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 上接  重构-改善既有代码的设计-第1例:租赁影片(1) 2  运用多态取代与价格相关的条件逻辑 2 ...

  7. 《重构-改善既有代码的设计》-第1例:租赁影片(1)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 买了<重构 - 改善既有代码的设计 >一书,一直没有好好看,大致过了下也觉得只是有点点印 ...

  8. 实践提高《重构改善既有代码的设计第2版》PDF中文+PDF英文+对比分析

    重构是编程的基础,是在不改变外部行为的前提下,有条不紊地改善代码.编程爱好者都知道,Martin Fowler 的<重构:改善既有代码的设计>已经成为全球有经验的程序员手中的利器,既可用来 ...

  9. 重构改善既有代码的设计(github源码)

    refactoring improving the design of existing code(重构改善既有代码的设计) https://github.com/CoderDream/refacto ...

  10. 重构:改善既有代码的设计(软件开发的不朽经典)

    重构:改善既有代码的设计(软件开发的不朽经典) 基本信息 作者: (美)Martin Fowler   译者: 熊节[同译者作品] 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:978 ...

最新文章

  1. java list 查找_java面试之容器
  2. Py之featuretools:featuretools库的简介、安装、使用方法之详细攻略
  3. 3DSlicer16:数据类型MRML
  4. Vue 适配移动端 使用 postcss-pxtorem lib-flexible 插件 转px为vw rem
  5. boost学习之boost::lock_guardT与boost::unique_lockT的区别
  6. linux中产生随机数函数,如何用C++产生随机数
  7. Nginx 系列:Nginx 实践,location 路径匹配
  8. 学习笔记——模板方法模式
  9. 问道手游服务器维护,问道手游2021年5月20日维护公告_问道手游2021年5月20日更新了什么_玩游戏网...
  10. Connection could not be established with host smtp.163.com 阿星小栈
  11. 【认识 NVIDIA GPU】GPU相关基础概念介绍
  12. 非计算机专业有前景吗,十大最有前景的专业,第一名居然不是计算机
  13. html5制作波浪,技能get:用HTML5实现波浪效果
  14. 【附源码】计算机毕业设计SSM网上商城比价系统
  15. 山东大学软件学院众智科学与网络化产业(网络、群体与市场)复习笔记
  16. 详解联想bios怎么进入u盘启动
  17. springboot feign too many bytes written executing
  18. 从long long 谈类型转换
  19. CDN新品发布:阿里云SCDN安全加速开放公测
  20. Windows Server 2012 R2 部署JavaWeb项目之环境、软件、配置

热门文章

  1. 【设计模式】观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
  2. 自己写的一个简单的购物车的登录购买
  3. 任务05—学习 MARKDOWN 语言
  4. SAP smartforms之Zebra print control language
  5. Java 集合系列(三)Collection 接口
  6. Java 8 Date-Time API 详解
  7. APK Expansion Files / Obb 接入介绍
  8. 【BUG】小米5中 video.js 在钉钉 webview 中全屏后 后退无法弹出虚拟键盘
  9. 如何编写更好的SQL查询:终极指南-第三部分
  10. 5 个关于 API 中日期和时间设计规则