重构原则
重构:对软件内部结构的一种调整,目的是在不改变软件客观察行为的前提下,提高其可理解性,降低修改成本。
何为重构
- 重构改进软件的设计。如果没有重构,程序的设计会逐渐腐败变质。而改进设计的一个重要的方向是消除重复代码。
- 重构使软件更易被理解
- 重构能帮助我们找到软件的bug
- 重构提高编程速度
良好的设计师快速开发的根本。重构可以帮助你更快地开发软件
何时重构
- 三次法则,事不过三,三则重构
- 添加新功能的时候重构
- 修补错误的时候重构
- 复审代码的时候重构
间阶层与重构
计算机科学是这样的一门科学:它相信所有的问题都可以通过增加一个间阶层来解决
间阶层的价值:
- 允许逻辑共享
- 分开解释意图和实现:你可以选择每个类和函数的名字,这给了你一个解释自己意图的机会。
- 隔离变化:通过使用子类来隔离同一对象修改对另一处引用带来变化的风险
- 封装条件逻辑:使用多态机制将条件逻辑转化为消息机制,这往往能降低代码的重复,增加清晰度并提高弹性
重构的难题
数据库
在非对象数据库中解决这个问题的办法就是:在对象模型和数据库模型之间插入一个分割层,这就可以隔离两个模型各自的变化。
你无须一开始就插入分割层,可以在发现对象模型变得不稳定的时候再做。
修改接口
关于对象:它允许你分开修改软件模块的实现和接口。你可以安全地修改对象内部实现而不影响其他人,但接口一旦修改,任何事情都可能发生。
当接口被那些“找不到,或者即使找到也不能修改”的代码引用的时候接口就被称为已发布接口
如果重构手法改变了已经发布的接口,你必须同时维护新旧两个接口,直到所有永不都有时间对这个变化做出反应。这时我们可以让老接口调用新接口。
千万不要复制函数的实现,那会让你陷入重复代码的泥沼中难以自拔。同时可以使用java提供的deprecation
不要过早发布接口。请修改你的代码所有权政策,使重构更顺畅。
Java中的异常,通常我们可以在模块中定义异常基类,所有的public函数只在自己的throws子句中申明这个异常。这样我们后续可以随意定义异常子类。
难以通过重构手法完成的设计改动
这种场景出现的比较少
何时不该重构
1、 现有代码根本不能正常运行。重构之前,代码必须能够在大部分情况下正常工作。其中一个折中的办法是讲比较大的软件封装为良好的小型组件。
2、 如果项目已经接近最后期限,你也应该避免重构。
重构与设计
有了设计,我可以思考的更快,但是其中充满了小漏洞
软件是纯思想产品。这和其他设计的具体实施有很大区别。
重构无法替代预先设计。但是有了重构你只要得到一个足够合理的解决方案就够了。重构带来更简单的设计,同时又不失灵活性,这也降低了设计过程的难度,减轻了设计压力。
哪怕你完全了解系统,也需要实际度量其性能,不要臆测。臆测会让你学到一些东西,但十有八九是错的。
重构与性能
虽然重构有可能导致软件运行更慢,但它也使得软件的性能优化更加容易。除了对性能有严格要求的实时系统,其他任何情况下“编写快速软件”的秘密就是:首先写出可以调试的软件,然后调整它以求获得足够的速度。
对于实时性要求比较高的系统,通常我们需要分解设计,给每个组件预先分配一定的资源(时间和执行轨迹)并严格执行。
另外如果我们持续关注软件性能,在做任何事情的时候都设法保证系统的高性能,这样有可能导致系统难以维护。
比较合理的做法是,开发阶段无需过于关注程序性能,在性能优化阶段(程序开发后期)按照某个特定的程序来调整程序性能。
大多数程序而言,大半的时间都耗费在一小部分代码上。
一个构造良好的程序可以从两方面帮助性能优化:首先让你有充裕的时间进行性能调整。因为构造良好的程序有助于开发进度的推进。其次面对构造良好的程序你在进行性能分析时有更细的粒度性能测量工具定位更精确。