项目现在正在原型阶段,很多类的实现都没有进行整理,当增加新功能的时候,为了不修改原有的功能,常常需要进行很多的copy-paste,这就导致了这个类代码的膨胀,以致到了不能维护的边缘。我用了两天时间对这个类进行了重构。做法如下:
将文件拷贝的方法提取到一个工具类中,为了便于测试,我让copy函数返回目的文件的句柄;
将不同类别属性的操作函数提取到自己对应的类中,于是我有了File1Op, File2Op, File3Op;
特殊考虑:
我又发现File2Op的操作又分几个小类,分别作用不同类的Scheme。
开始的时候,我本来想用一个父类加几个子类的方法,后来觉得这个方法不够完美, 与是用了组合方式,
具体如下:
FileOp类具有基本的算法,并保存一个接口,当处理不同类别的xml时,就将保存这个处理方法的类的实例传递给FileOp,后者就能实现不同处理。
将来增加新的类别的话,只需要增加新的处理方法就可以了。
当然这样做有一个缺点,FileOp保留一个算法和流程,万一一个新的xml类别不遵守这个流程,麻烦就大了。
最后,我还将原有的testcase移植到重构后的代码,以确保所有功能都保持不变。
我从这次重构中学到的东西:
- 分析类的功能;
- 将重复代码提取为函数;
- 将独立的职责提取为独立的类;
- 分析类的特点,提取部分类的公共特性,并将非公共的部分提取为独立的类;
- 将一些文件拷贝到指定的文件夹;
- 用jaxb分析这些文件,生成对象,并获取该对象的部分属性;
- 这些对象属性分成几个类别,不同类别的属性记录在不同的资源文件中,以供其它模块的调用;
将文件拷贝的方法提取到一个工具类中,为了便于测试,我让copy函数返回目的文件的句柄;
将不同类别属性的操作函数提取到自己对应的类中,于是我有了File1Op, File2Op, File3Op;
特殊考虑:
我又发现File2Op的操作又分几个小类,分别作用不同类的Scheme。
开始的时候,我本来想用一个父类加几个子类的方法,后来觉得这个方法不够完美, 与是用了组合方式,
具体如下:
FileOp类具有基本的算法,并保存一个接口,当处理不同类别的xml时,就将保存这个处理方法的类的实例传递给FileOp,后者就能实现不同处理。
将来增加新的类别的话,只需要增加新的处理方法就可以了。
当然这样做有一个缺点,FileOp保留一个算法和流程,万一一个新的xml类别不遵守这个流程,麻烦就大了。
最后,我还将原有的testcase移植到重构后的代码,以确保所有功能都保持不变。
我从这次重构中学到的东西:
- 继承和组合是不同的;
- 开始重构前,先搞清楚原有的功能,不用非常清楚,但起码测试用例必须全部知道;