前言
最近入职了一家新公司,接承已有系统继续开发。原有架构非常厉害,对于我来说有很多学习点。但是也有些不足,就是在架构之后的扩展因为历史,人员变迁的原因,出现了很多遗留代码。这些在我处理新特性时非常的麻烦。这本书的出现及时将我拉出这个泥潭。故,先在这里做摘录,融缩精华,以便之后进行个人加工
书的结构

修改软件
-
修改软件的四个起因、
1. 添加新特性 2.修正bug 3.改善设计 4.优化资源使用
-
行为对于软件来说是最重要的一样东西。软件的用户要依赖于软件行为。用户喜欢我们添加行为,然而如果我们改变或移除了他们原本所依赖的行为,那么他们就不会在相信我们
-
在不改变软件行为的前提下改善其设计的举动称为重构
-
对于重构来说,改变程序的结构目的是让代码更容易维护。
-
对于优化来说,改变程序使用的某些资源(时间/内存),让成本下降
-
要想安全地进行修改,关键在与理解
-
避免修改带来的后果
1.类越来越大,越来越难以维护 2.对代码生疏 3.带来恐惧心理
带着反馈工作
- 修改应该有防护网来保护安全
- 回归测试:通过测试来检验变化。周期性地运行测试来检验已知的良好行为,以便确诊软件是否还像它以前那样工作
- 好的单元测试应具备的品质
1.运行快 2. 能帮助我们定位问题所在
- 依赖性是软件开发中最为关键的问题之一。在处理遗留代码的过程中很大一部分都市围绕着“解除依赖性以便使改动变得更为容易”这个目标来进行的
- 遗留代码的困境
我们在修改代码时,应当有测试在周围“护”着。而为了将这些测试安置妥当,我们往往又得去修改代码
- 遗留代码修改算法
1.确定改动点
2.找到测试点
3.解依赖
4.编写测试
5.修改,重构
感知与分离
- 感知:当我们无法直接访问到代码计算出的值时,就需要通过解依赖来“感知”这些值
- 分离:当我们无法将哪怕一小块代码放入到测试用具中去运行时,就需要通过解依赖将这块代码分离出来
- 在编写测试时,我们得采用分而治之的方案
- 伪对象有两面性,对被测试者和测试者拥有两套逻辑
- 仿对象就是在内部进行断言检查的伪对象
接缝模型
- 接缝,指程序中的一些特殊的点,在这些点上你无需作任何修改就可以达到改动程序行为的目的
- 对象接缝是面向对象语言中最有用的一种接缝
工具
- 在拿到一个自动化重构工具之后,要先编写测试,然后自动重构,防止工具本身的漏洞带来重构的漏洞
- 仿对象 www.mockobjects.com
- 单元测试工具 : junit,xunit
- 集成测试工具: fitness (www.fitness.org)
时间紧迫,但必须修改
新生方法
- 场景
当需要一个系统中添加特性且这个特性可以用全新代码来编写时,建议将这些代码写在一个新的方法中,并在需要用到这个新功能的地方调用这一方法。这样至少可以为新编写的代码进行测试 - 步骤
1.确定修改点 2.如果修改可以在修改点 以单块连续的语句序列出现,那么在该点 插入新方法的调用,然后注释掉 3.确定入参 (原方法的局部变量) 4.确定出参 5.测试驱动开发新方法 6.取消注释,生效新方法
- 优缺分析
- 缺点:效果上暂时放弃了原方法以及它所属的类
- 优点: 新旧代码被清楚的隔离开,且新代码被覆盖在测试网之下了
新生类
- 场景
原类在对象创建方面有大量依赖,导致不可能在合理时间限期内使这个类在测试用具中被实例化;原类含有很多隐藏依赖,需要进行大量侵入式重构才能解除这些依赖 - 解决方案
创建另外一个类来容纳所要进行的改动,并在原类中使用这个新类
网友评论