2013-03-04 20 views
2

我有三个具体的类 -重构复制和高度耦合的代码

public class ClassA{ 
    public C1 processA(C1 c1){ 
     //lots of ugly code that copies 
     //one field to another 
     //return c1 
    } 
    public List<C1> processA(List<C1> c1s){ 
     //iterate over c1s 
      //call process(c1) 
      //add returned value to list 

     //return list 
    } 
} 


public class ClassB{ 
    public C2 processB(C2 c2, C3 c3){ 
     //lots of ugly code that copies 
     //one field to another 
     //return c2 
    } 
    public List<C2> processB(List<Pair<C2, C3> pairs){ 
     //iterate over pairs 
      //call process(c2, c3) 
      //add returned value to list 

     //return list 
    } 
} 

public class ClassC{ 
    public C4 processC(C4 c4, C5 c5, C1 c1){ 
     //lots of ugly code that copies 
     //one field to another 
     //return c4 
    } 
    public List<C4> processC(List<Triple<C4, C5, C1> triples){ 
     //iterate over triples 
      //call process(c4, c5, c1) 
      //add returned value to list 

     //return list 
    } 
} 

我想在这个过程中消除重复(列表...)方法。我不关心processA(C1),processB(C2,C3),processC(C4,C5,C1)方法,它们将保持不变。重构此代码有哪些选项?

+5

从重命名方法,变量开始重构并输入名称。 – 2013-03-04 15:35:05

+2

更改您的变量和方法名称。这将是我的第一步。 – 2013-03-04 15:35:16

+1

创建一个接口并覆盖'process()' – noMAD 2013-03-04 15:36:33

回答

1

旁代码重复,我看其他两个问题的代码,你可以解决,以消除重复的代码味道:

  1. 几类的紧耦合。虽然我不能在不了解这些类的领域及其实际描述性名称的情况下确认这一点,但鉴于C1-C5足够相关以使属性复制成为有效的操作,我认为一个好的起点是重新考虑这些类的设计。例如,它们是否可以是composed,以便C1-C5共享的属性可以始终与新的bean类一起存储?
  2. 做同样事情的多种方式,或者在传统的OOD术语中,它缺乏“关注点分离”。这些类不仅关心转换(从C3到C2等),还要收集对集合的操作结果。考虑将后者的担忧分离出来,或许只需让客户使用更通用的收集解决方案,如apache collection's Collections.collect()。因为A类和B类正试图为用户做多件事情,所以对于单个项目和集合你有多种方法。 (可能有趣的是,在像scala或groovy这样的函数式语言中,通用集合解决方案将更加优雅和简洁,从而减少了对这些便捷方法的需求。)