重构的体会——类属性优先移动
今天开始对一个别人写的项目进行优化,我先把类之间的关系想好好,开始移动方法,相应的再移动相应的类属性,改到后面,发现越改越多,基本上改完了所有方法重构就全部完成了,但是改动很大,而且中间没有测试的机会,一直有错误,耦合的太紧密了,没法一步一步的做,完成了大概一半的样子,发现做不下去了,即使硬着头皮做下去出错的可能太大了,我没把握重构后不出错。
没办法,又重新checkout了一份代码,想了下,如果先移动方法,方法中包含了属性,就要求属性也进行相应的移动。但是如果只移动属性,就可以通过如下方法很容易实现移动属性,而相应的方法还在原来的位置。例如A类的a属性,移动到B类中,A类的do()方法操作了a。这种情况可以将B类型的一个引用传给A,把a移动到B类中并提供set/get方法。然后将A类中给a属性赋值的地方全部替换成b.setA(),相应的获取a的值的地方替换成b.getA(),这样就实现了类属性的移动。完成了这一步,整个程序跟原来是等价的,可以直接验证。因为没有修改方法的调用,且逻辑不复杂,故出错的几率要小很多。
public class A { private T a; public String do() { a = new T(); System.out.println("a:"+a.getValue()); return a.getValue(); } } class T { private String value;
// setValue/getValue …… }
移动属性后的结果
public class A { private B b; public String do() { b.setA(new T()); System.out.println("a:"+b.getA().getValue()); return b.getA().getValue(); } } class B { private T a; // setA/getA …… }
如果只是看这个小例子,看不出移动属性后有什么好处,但是在一个遗留项目中的某一个类包含多许多不应该在该类中的属性时,且该类的许多方法都要用到这些属性时,这样将属性移到本来应该的位置中,就能够清晰每个类的职责,对后面的重构是一个基础。
每多学一点知识,就少写一行代码。