重构概念

  • 重构是一种对软件内部结构的改善,目的是在不改变软件的可见行为的情况下,使其更易理解,修改成本更低。

  • 在保持功能不变的前提下,利用设计思想、原则、模式、编程规范等理论来优化代码,修改设计上的不足,提高代码质量。

 

为什么要重构?

  • 重构是时刻保证代码质量的一个极其有效的手段,不至于让代码腐化到无可救药的地步。

  • 项目在演进,代码不停地在堆砌,代码总是会往越来越混乱的方向演进。

  • 优秀的代码或架构不是一开始就能完全设计好的,随着系统的演进,重构代码也是不可避免的。

  • 重构是避免过度设计的有效手段。

  • 将一个比较烂的代码重构成一个比较好的代码,会让你很有成就感。对一个工程师本身技术的成长也有重要的意义。初级工程师在维护代码,高级工程师在设计代码,资深工程师在重构代码。

 

重构的方式:

  • 大型重构指的是对顶层代码设计的重构,包括:系统、模块、代码结构、类与类之间的关系等的重构,重构的手段有:分层、模块化、解耦、抽象可复用组件等。

  • 小型重构指的是对代码细节的重构,主要是针对类、函数、变量等代码级别的重构,比如规范命名、规范注释、消除超大类或函数、提取重复代码等。

 

对重构的态度:

  • 寄希望于在代码烂到一定程度之后,集中重构解决所有问题是不现实的,需保持持续重构。

 

单元测试(Unit Testing)- 最可落地执行、最有效的保证重构不出错的手段:

  • 单元测试是代码层面的测试,由研发自己来编写,用于测试“自己”编写的代码的逻辑的正确性。

  • 写单元测试的过程本身就是代码 Code Review 和重构的过程,能有效地发现代码中的 bug 和代码设计上的问题。对集成测试的有力补充、帮助我们快速熟悉代码、TDD 可落地执行的改进方案。

  • 如何编写单元测试?写单元测试就是针对代码设计各种测试用例,以覆盖各种输入、异常、边界情况,并将其翻译成代码。

  • 写单元测试尽管繁琐,但并不是太耗时;放低对单元测试代码质量的要求;覆盖率作为衡量单元测试质量的唯一标准是不合理的;单元测试不要依赖被测代码的具体实现逻辑;单元测试框架无法测试,多半是因为代码的可测试性不好。

  • 单元测试为何难落地执行?写单元测试本身比较繁琐,技术挑战不大,很多程序员不愿意去写;开发进度紧,执行虎头蛇尾。

 

代码的可测试性:

  • 针对代码编写单元测试的难易程度

  • 依赖注入是编写可测试性代码的最有效手段

 

常见的测试不友好的代码:

  • 代码中包含未决行为逻辑

  • 滥用可变全局变量

  • 滥用静态方法

  • 使用复杂的继承关系

  • 高度耦合的代码

 

解耦 - 大型重构的有效手段

  • 解耦保证代码松耦合、高内聚,是控制代码复杂度的有效手段。代码高内聚、松耦合,意味着代码结构清晰、分层模块化合理、依赖关系简单、模块或类之间的耦合小,那代码整体的质量不会差。

  • 是否需要解耦?修改代码是否牵一发而动全身;模块与模块、类与类之间的依赖关系画出来看复杂性

  • 给代码解耦的方法:封装与抽象、中间层、模块化、设计思想与原则(单一职责原则、基于接口而非实现编程、依赖注入、多用组合少用继承、迪米特法则等)、设计模式(观察者模式等)。

 

摘自:http://gk.link/a/10iey

图片


点击 阅读原文 查看在线思维导图


更多相关文章

  1. 建造者模式和原型模式在开源代码中的应用
  2. 代理模式在开源代码中的应用
  3. 工厂模式在开源代码中的应用
  4. 单例模式在开源代码中的应用
  5. 解答 H 大的公布的 10 道 Java 测试题
  6. 几款代码高亮组件的体验,说不定你以后会用到
  7. 从代码的改进,看参数行为化与Lambda
  8. Java8如何让自己的代码不那么啰嗦?!
  9. bootstrap高亮显示代码,且横向滚动

随机推荐

  1. GitHub 告别中文仓库刷榜/霸榜
  2. 数据结构与算法——图最短路径
  3. GitHub 热门:微软新开源的 Python 静态类
  4. 数据结构与算法——图论基础与图存储结构
  5. 一道简约而不简单的算法题--数据流的中位
  6. GitHub 热门:Python 算法大全,Star 超过 2
  7. GitHub 热门:别再用 print 输出来调试代码
  8. 真香!GitHub 核心功能都免费开放了
  9. 一网打尽!二分查找解题模版与题型全面解析
  10. 数据结构与算法——最小生成树