读书笔记 -《重构-改善既有代码的设计》Part1

文章目录

    • 什么是重构
    • 重构 - 第一个案例
    • 重构原则
      • 为何重构
      • 何时重构
      • 何时不该重构
      • **为什么重构有用 - Kent Beck**
      • 如何与产品经理沟通重构的事情
      • 间接层和重构
      • 重构与设计
      • 重构与性能

下一节 读书笔记 -《重构-改善既有代码的设计》Part2

什么是重构

重构是这样一个过程:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构。

为什么编码后还需要改进程序内部结构,不是先设计而后编码吗?

在软件版本迭代的过程中,随着特性的增加,开发人员的流动等客观原因,软件代码质量会逐渐下降,而不断的”重构“正是改善软件代码质量的手段。

面向对象机制对于”重构“有很大的作用

重构 - 第一个案例

  • 如果程序需要添加一个功能,但是代码结构无法方便的达成目的,那就需要考虑重构代码,而后再方便的添加特性

  • 当我们进行重构的时候,第一步需要考虑的是构建一组可靠的测试环境。

    好的测试是重构的根本,是必要的安全保障。

  • 代码块越小,代码的功能就越容易管理,代码的处理和移动就越轻松。

  • 重构技术就是以微小的步骤修改程序,一步一步演进。

  • 好的代码应该清楚表达出自己的功能,变量名称是代码清晰的关键。-- 命名规则对于好的代码是重要的

第一个案例给我们最大的启发是重构的节奏:测试,小修改,测试,小修改,测试,小修改…正式这种节奏让重构得以快速而安全的前进。

重构原则

重构的两种定义

重构(名词)

对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。

重构(动词)

使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。

Kent Beck 两顶帽子

比喻两种代码行为,一是添加新功能,二是重构

添加新功能时不应该修改既有代码,重构时不应该添加新功能,重构一般不必修改测试

为何重构

  • 重构改进软件设计

    没有重构,程序的设计会逐渐腐败变质

  • 重构使软件更容易理解

    Johnson 把 “早期重构” 描述为 “擦掉窗户上的污垢,是你看的更远”

    重构让代码看起来更轻松

  • 重构帮助找到 bug

    在理解代码的基础上,找到 bug 不是一件痛苦的事情

    Kent Beck: “我不是一个伟大的程序员,我只是个有着一些优秀习惯的好程序员。”

  • 重构提高编程速度

何时重构

我们从不为重构而重构

重构不是一件应该特别拨出时间做的事情,而是应该随时随地进行的。

三次法则

Don Roberts 给了一条准则:事不过三,三则重构

添加功能时重构

最常见的重构时机就是我想给软件添加新特性的时候。

更快速的厘清代码结构,便于理解;更轻松的添加功能,便于扩展。

修补错误时重构

调试过程中运用重构,多半是为了让代码更具可读性。

检视代码时重构

Code Review 过程中,可以发现很多代码问题,这种活动能够改善代码开发状态,优化代码结构演进。

何时不该重构

  • 当你需要考虑重新编写所有代码的时候,重构没有意义,因为这成了一个新的项目
  • 重构前代码应该是绝大多数情况下稳定的,如果做不到,应该考虑重写
  • 如果项目接近最后期限,应该避免重构;但反过来说,如果最后你没有足够时间,通常表示你其实早该进行重构

为什么重构有用 - Kent Beck

引起程序难以处理需求的原因

  • 难以阅读的程序,难以修改;

  • 逻辑重复的程序,难以修改;

  • 添加新行为时需要修改已有代码的程序,难以修改;

  • 带复杂条件逻辑的程序,难以修改

我们希望程序

  • 容易阅读
  • 所有逻辑都只在唯一地点指定
  • 新的改动不会危及下现有行为
  • 尽可能简单表达条件逻辑

如何与产品经理沟通重构的事情

如果产品经理懂技术,推动重构不会有太大阻力;

如果他对产品质量感兴趣,可以从产品质量入手;

如果重构切实可行,而产品经理要求进度,那么可以重构,重构让程序更容易快速的满足产品要求。

间接层和重构

Kent Beck : 计算机科学是这样一门科学:它相信所有问题都可以通过增加一个间接层来解决

间接层的价值

  • 允许逻辑共享

    一个子函数在两个不同地点被调用,或超类中的某个函数被所有子类共享

  • 分开解释意图和实现

    类和函数名解释意图,其内部就是实现意图

  • 隔离变化

    很有可能我在两个不同的地点使用统一对象,其中一个地点我想改变对象行为,但如果修改了它,我就要冒同时影响两处的风险。为此我做出一个子类,并在需要修改处引用这个子类,现在,我可以修改这个子类而不必承担无意中影响另一处的风险。

  • 封装条件逻辑

    对象有一种奇妙机制:多态

如果间接层已经没有价值,可以直接拿掉。

重构与设计

重构与设计是互补的关系,而非相互取代的关系。

软件设计是前提,重构是软件开发过程的代码改善手段。

重构可以带来更简单的设计,同时又不损失灵活性,这也降低了设计过程的难度,减轻了设计压力。

重构与性能

重构可以对程序的性能造成怎样的影响?

如何关注性能:

  • 时间与算法

    分解设计时就需要预算时间复杂度和空间复杂度,对于性能要求很高的实时系统是十分必要的

  • 持续关注性能提升

    这取决于程序员的根本素质,需要在算法/数据结构/设计模式上有一定造诣

  • 性能优化阶段优化

    开发过程中不特别关注,直至进入性能优化阶段(通常是在开发后期)

    统计哪些地方大量消耗时间和空间,针对性的优化,结构良好的代码会帮助程序员更快更好的调优性能

你可能感兴趣的:(重构)