1,什么是重构?

在不改变软件可观察行为的前提下,使用一些重构的手法,提高代码可读性。

换句话说,在保持软件可用的前提下,修改代码使得更加容易被理解。

2,为什么重构?

为了后续的代码维护和修改,易读是重构的核心价值。

除此之外,重构随之带来的好处有:

  • 找到bug
  • 提高编程速度(在代码量累计到一定程度时,重构过的代码会更加易于添加新功能)

3,什么时候重构?

  • 添加新功能之前重构

    添加新功能最快的方法往往是先修改现有代码,使新功能容易被加入。

  • 使代码更易理解时重构

  • 顺便重构(修复bug,添加新功能)

  • 代码复审(code review)时重构

总而言之:重构的门槛远远没有想象中那么高,重构是对既有代码的修改,也许我们在无意识中就已经做了这样的工作,一方面继续保持良好的编程习惯,另一方面学习更加成体系的重构手法。

就如同重构的定义,在可用的前提下,提高重构的技术。

什么时候不应该重构?

对于一段凌乱的代码,如果不需要修改它,就不需要重构。

只有当你需要理解其工作原理时,重构才变得有价值。

如果重写比重构更加容易,那就不需要重构了。(判断)

4,重构会遇到哪些问题?

“毕竟生活里很少有晴空万里的好事”

——Martin Fowler

延缓新功能开发

先添加新功能再重构,还是先重构再添加新功能,这不是一个对错的问题,而是一个取舍的分叉口。

Martin Fowler的回答醍醐灌顶,作为程序员往往对代码库的整洁有着极高的追求,以技术去驱动重构没有错,但现实世界往往取决于经济。

“重构的意义不在于把代码库打磨的闪闪发光,而是纯粹经济角度出发的考量。”

“重构应该总是由经济利益驱动。”

除了重构之外,现在的团队开发,前后端分离等等,不仅是技术发展的必然结果,同时也是经济化必然的结果。同样的场景,是否重构更多取决于经济条件。

代码所有权成为重构阻力

修改函数声明和调用可能也会遭遇声明者无法修改调用者代码的权限问题。

Martin Fowler推荐的是团队代码所有制。对于跨团队的兼容,可以采用类似GitHub上开源的模型。

(在强代码所有制和混乱修改的折中)

分支合并问题

在隔离的分支上工作的越久,需要完成的集成工作就越困难。

持续集成(CI:Continuous Integration):也称基于主干开发。为了避免彼此分支差异过大,每个团队成员每天至少向主线集成一次。

使用CI的代价:必须使用相关的实践保持主线的健康状态。

快速的自测试

建立一套完备的测试套件,并且需要快速运行。

准备这套测试套件的代价很高,但收益也是可观的:

  • 使重构可行性变得更大
  • 使添加新功能更加安全
  • bug排查更加迅速,容易

遗留代码

重构可以很好的理解遗留系统,但同时又是十分危险的。

再次推书了,hhh《修改代码的艺术》:运用重构手法创造出接缝,在接缝处插入测试。(当然,具有一定风险)

数据库

flower先生的同事发明了一套渐进式数据库设计和数据库重构的方法.......

(看书就好像布置家庭作业一样。。。难顶)

5,重构与性能优化

重构:使代码更易读

性能优化:使代码运行速度更快

先写出可调优的软件(重构),然后对其调优达到足够的速度(性能优化)。

关于性能优化:现状——大半时间都花在了一小段代码上。

使用一个度量工具监控程序的运行,找出性能热点的一小段代码集中调优。

6,自动化重构

Intellij IDEA可以自动重构的......(说明我对这个工具的利用程度还不够高)

Chapter 2 :重构的原则的更多相关文章

  1. 代码重构方向原则指导(转载 cnblogs)

    英文原文:Hill Climbing (Wonkish)   重构是一种对软件进行修改的行为,但它并不改变软件的功能特征,而是通过让软件程序更清晰,更简洁和更条理来改进软件的质量.代码重构之于软件,相 ...

  2. Chapter 5.依赖倒转原则

    抽象不应该依赖谢姐,细节应该依赖于抽象:针对接口编程,不要对实现编程.例如电脑内的内存坏了不会影响到其它模块,而且什么品牌都可以插入内存插槽,而不仅限于某个品牌的内存条. A.高层模块不应该依赖底层模 ...

  3. Chapter 4.开放-封闭原则

    开放-封闭原则:是说软件实体应该可以扩展,但不可修改. 设计人员必须对于他设计的模块应该对哪种变化封闭做出选择,先猜测出最有可能发生的变化种类,然后构造抽象来隔离那些变化. 面对需求,对程序的改动是通 ...

  4. Chapter 3.单一职责原则

    单一职责原则:就一个类而言,应该仅有一个引起它变化的原因. 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力,就等于把这些职责耦合在一起, ...

  5. 重构:CSS也面向对象

    最初接触到面向对象的CSS还是因为项目中的CSS已经超过八千行,缺乏约束和管理,在近期或者是不远的将来,有迫切的要求需要重构.在前端重构中,我们已经讨论过了JavaScript面向对象的重构,在这个时 ...

  6. CSS也需要重构

    最初接触到的CSS面向对象,是项目里的CSS超过8千行,缺乏约束和管理,在近期或不远的将来,有迫切的要求需要重构.CSS面向对象和模块化. CSS代码遇到的问题: 重用性差,看着一个CSS的名称,很难 ...

  7. 架构师修炼 III - 掌握设计原则

    关于软件的设计原则有很多,对于设计原则的掌握.理解.实践及升华是架构师的一项极为之必要的修炼. 记得在12年前第一次阅读<敏捷开发>时,五大基本设计原则就深深地植入到我的脑海中一直影响至今 ...

  8. 重构——Martin Fowler 阅读笔记

    重构的第一步: 为即将修改的代码建立一组可靠的测试环境. 和任何重构手法一样,当提炼一个函数时,我们必须知道可能出什么错. 安全步骤: 首先在一个函数内找到局部变量和参数.任何不会被修改的变量都可以被 ...

  9. 面向对象设计模式纵横谈:Singelton单件模式(笔记记录)

       李建忠老师讲的<面向对象设计模式纵横谈>,早就看过了,现在有了时间重新整理一下,以前的博客[赛迪网]没有了,现在搬到博客园,重新过一遍,也便于以后浏览. 设计模式从不同的角度分类会得 ...

随机推荐

  1. docker alphine 设置系统日期

    设置时区为上海 RUN apk add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && ...

  2. CodeForces-1265E(期望)

    题意 有1~n镜子,每个镜子说你漂亮的概率是pi/100,如果第i个回答你漂亮那么就一直问到第n个说漂亮为止,否则重新从1开始问,一天只问一个镜子,问直到镜子n说你漂亮的期望天数. 思路 设Ei为问到 ...

  3. 21.决策树(ID3/C4.5/CART)

    总览 算法   功能  树结构  特征选择  连续值处理 缺失值处理  剪枝  ID3  分类  多叉树  信息增益   不支持 不支持  不支持 C4.5  分类  多叉树  信息增益比   支持 ...

  4. nmcli详解

    1. nmcli 安装 [root@liujunjun ~]# yum install -y NetworkManager CentOS7默认已安装了 2. nmcli 基本选项 选项 作用 -t 简 ...

  5. Java.awt.geom.AffineTransform 的使用

    https://docs.oracle.com/javase/8/docs/api/java/awt/geom/AffineTransform.html http://www.cjsdn.net/Do ...

  6. 安卓投屏助手(ARDC)最新版

    安卓投屏助手(B1493) 1.兼容Android 10: 2.增加灭屏投屏功能: 3.增加显示鼠标位置功能; 4.增加了虚拟NaviBar功能: 5.捐赠界面增加QQ支付,移除Paypal,感谢大家 ...

  7. error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_8UC1 images when mode != CV_RETR_FLOODFILL otherwise supports CV_32SC1 images only in

    问题: error: (-210:Unsupported format or combination of formats) [Start]FindContours supports only CV_ ...

  8. SpringCloud微服务(01):Eureka组件,管理服务注册与发现

    本文源码:GitHub·点这里 || GitEE·点这里 一.Eureka基本架构 1.Eureka简介 Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,SpringCl ...

  9. Redis在Window下的安装部署

    一.下载 由于redis官方不支持windows,所以需要在github上下载window的版本:下载地址.redis约定版次版本号(即第一个小数点后的数字)为偶数的版本是稳定版本(如2.8,3.0) ...

  10. 计算机网络知识(TCP连接,TCP/UDP区别,HTTP与HTTPS,Socket原理等等)

    1.网络七层协议包含,物理层.数据链路层.网络层(ip协议).传输层(TCP传输控制协议.UDP用户数据报协议).会话层.表示层.应用层(http协议).是一个提供的概念架构协议. 2.TCP/IP协 ...