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