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. 附002.Minikube介绍及使用

    一 Minikube介绍 1.1 概述 Minikube是一种可以在本地轻松运行Kubernetes的工具.Minikube在笔记本电脑的VM中运行单节点Kubernetes集群,供希望尝试Kuber ...

  2. WASM 成为 HTML、CSS 与 JS 之后的第 4 门 Web 语言

    大家都知道,万维网联盟 W3C 认证的 Web 语言有 HTML.CSS 与 JavaScript,而近日联盟正式宣布 WebAssembly 核心规范(WebAssembly Core Specif ...

  3. Springcloud 微服务 高并发(实战1):第1版秒杀

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列之15 [博客园总入口 ] 前言 前言 疯狂创客圈(笔者尼恩创建的高并发研习社群)Springcloud 高并发系列文章,将为大家介绍三个版 ...

  4. java中的this、super、static、final、abstract关键字的作用

    this关键字的作用 1.this是对象内部指代自身的引用,同时也是解决成员变量和局部变量同名问题: 2.this可以调用成员变量,不能调用局部变量: 3.this也可以调用成员方法,但在普通方法中可 ...

  5. 【Linux命令】磁盘分区,格式化,挂载命令,创建交换分区(fdisk,mkfs,mount,umount)

    友情链接 磁盘分区,格式化,挂载,创建交换分区:https://www.cnblogs.com/HeiDi-BoKe/p/11936998.html RAID工作级别:https://www.cnbl ...

  6. 在ASP.NET Core 3.0中使用Swagger

    1.使用NuGet安装以下依赖: Swashbuckle.AspNetCore 注:版本选最高版本的,我选 5.0 rc4 2.在ConfigureServices添加以下代码 services.Ad ...

  7. Inherit from the Business Class Library Class 继承自Business类(EF)

    In this lesson, you will learn how to implement business classes for your application using the Busi ...

  8. Python Web(四)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.Django-forms作用 前端和后端都要校验 前端校验的目的:减少后端的压力 用forms可以同时完成前端 ...

  9. javaweb 复习随笔

    js和jsp区分: js是一种脚本语言,常运行在前台和客户端交互,不会给服务器带来负担,可以更好的修饰静态页面 jsp可以说是servlet的一种,jsp会先翻译,翻译成Servlet执行,运行在服务 ...

  10. SAP 销售订单交货对成本中心记账

    销售订单发货不计入主营业务成本,而是直接接入费用科目,与成本中心挂钩的业务经常发生.不少公司只是简单地处理交货,计入主营业务成本,然后财务再手工将成本归结到相关的成本中心.其实SAP系统是支持销售订单 ...