软件开发中的理想与现实(三)——用重构来清扫战场

2月17日的早晨非常寒冷,就算躲在被子里也可以清楚地感觉到,不过到实验室就不会觉得冷了(嗯,有空调就是好啊 ),所以,我很早就来了。
重新检查大家的代码,我有种想重写的冲动(呵呵),不过这正合我意,因为今天的工作就是清扫战场,做清扫的人当然是大家。
首先我把需要修改的内容列一下:
  1. 在算Prime的时候没有采用最优化的算法。我们最开始采用的方法是开一个bool类型的大数组,数组下标对应正数,然后不断用乘积的方法标出所有不是素数的数,最后再遍历一遍数组收集所有是素数的数。这种方法不是最好,还有优化的余地。
  2. 没有把算过的Prime缓存起来。其实Prime这个东西很乖,不管怎么算,一个数是Prime的那么它的性质永远都不会变,因此,适当的缓存一些数,可以提高不少效率。
  3. 采用vector存储得到的Prime。出于众所周知的原因,当vector大小改变时代价是很大的,换一个其他东西作存储或许会更好。
好,准备好问题当然就可以开工了。
作为一种优化性质的修改,最关键的就是保证原来 已实现的功能不能消失接口不能够改变。这在原来真的挺难做到(嗯,我很讨厌那种一波未平、一波又起的解决问题方式,那是一种折磨 ),不过现在有了单元测试用例做保证,那就没有任何疑虑了——只要通过了如此充分的单元测试,原有的功能当然没问题啦。OK,麻烦一个个被解决,无论是简单问题还是复杂问题,我们始终可以很放心的对原来的代码动刀子。
不过这种优化只是最初级的 重构(哦,这就算是重构啊),比较需要 勇气的还在后面——嗯,我这个合格的客户又要发挥作用了。
新的需求:CPrime类要能够处理负数的情况。
  1. 约定,如果一个数的绝对值是质数则这个数就是质数。
  2. 传入CreatePool的max是质数的绝对值范围,也就是找出所有大于等于-|max|并小于等于|max|的所有质数。例如,CreatePool(-5)则会把-5、-3、-2、2、3、5都放到Pool里面去。
  3. 传入GetPrime的index如果大于等于0,则是从最小的质数开始按从小到大的顺序获得质数,0代表最小的质数,如果小于0,则意味着从最大的质数开始按从大到小的顺序获得质数,-1代表最大的质数。例如,CreatePool(-5)之后再GetPrime(2),拿到的是-3,GetPrime(-3),拿到的是3。
不要问我为什么会有这种需求 ,反正就是要做了。嗯,其实问题也不大,大家其实一看就很明白,毕竟我们通过刚才的练习已经很明确如何做功能上的重构,只不过这次我们需要把已有的测试用例先一个一个按照新的需求进行改变(比较繁琐,需要勇气来做这件事情)。嗯,一次全改完还是分批改呢?我觉得可以根据测试用例的类型来分批改变,这样我们依然可以一小步一小步的可靠的开发。
虽然通过这些练习并没有了解多少重构的理论,但是我们已经有信心在未来的开发中运用重构的方法来清扫以前留下的麻烦。


参考文献:
[1] Robert C. Martin,敏捷软件开发:模式、原则和实践,中国电力出版社,2004
[2] Kent Beck,测试驱动开发,中国电力出版社,2004.3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值