代码复用有以下几个好处:
- 1. 避免重复劳动,提高效率;
- 2. 减少需求变动影响的代码范围;
- 3. 保持系统的一致性;
- 4. 降低测试成本;
- 为了实现代码重用,有以下几个方法可以使用:抽取方法,抽取类。
- 抽取方法适用于class中的复用,比如:
- class A{
- public void x0(){
- ……
- }
- public void x1(){
- ……
- }
- }
- 假设x0和x1中都有排序的要求,我们可以抽取一个公共的方法sort,然后在x0和x1中调用它.将来如果需要调整sort方法,则只需要改动一个地方。
如果我们发现sort不只是A中需要,其他的类也需要,我们可以抽象一个class C,它包含sort方法,所有需要排序的class都可以实例化c并引用C。
在抽取方法时,可能会发现原始方法的需求并不完全一致的情况,根据不一致的程度不同,可以采用不同的方法,大致分成以下几种:参数值区别,参数类型的区别,部分逻辑的区别。
所谓参数值的不同,比如两个都是sort,只是排序的参数不同。这就涉及到参数抽取的问题,有时候参数会比较多,这也会影响方法到可读性,进而影响到可理解性。有的人喜欢用hashmap来处理,个人觉得不妥,因为读者看不出hashmap有哪些字段。如果一定要这么用,请用注释详细说明。使用值对象,也许是更好的办法。当然最好在值对象中加入factory 方法。
所谓参数类型的不同,比如一个是对整数排序,另一个是对long排序。这就需要使用泛型。一种方法是class的泛型,另一种是method的泛型。class的泛型定义如下:
public class Pair<T>{
public T get(int idx);
}
如果class中只有少数几个方法是泛型的可以使用如下的方法:
public <T> T get(int idx);
如果希望对类型做限制可以使用extends的语法,extends可以指定多个接口。详细细节可以参看java核心编程。
如果两次调用,大部分都一样,但是小部分不同,我常用的办法加一个参数,然后根据参数选择不同的分支。这也许并不总是最好的办法,也许可以抽取出单独的类,并使用继承的方式隔离不同的那些代码。
总而言之,通过这些方法,通常可以极大的减少重复代码的出现。