重构重复和高度耦合的代码

时间:2013-03-04 15:33:53

标签: java design-patterns refactoring

我有三个具体的课程 -

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
    }
}

我想删除进程(List ...)方法中的重复。我不关心processA(C1),processB(C2,C3),processC(C4,C5,C1)方法,它们将保持不变。重构此代码有哪些选择?

1 个答案:

答案 0 :(得分:1)

除了代码重复之外,我还看到了代码中的另外两个问题,您可以解决这些问题以消除代码重复的气味:

  1. 几个类的紧耦合。虽然我不能在不知道这些类的域名及其实际描述性名称的情况下确认这一点,但是看到C1-C5足以使属性复制成为有效的操作,我认为一个好的起点是重新考虑这些课程的设计。例如,它们可以是composed,以便C1-C5共享的属性总是可以用新的bean类存储吗?
  2. 做同样事情的多种方式,或者,在传统的OOD术语中,它缺乏“关注点分离”。这些类不仅涉及转换(C3到C2等),还涉及收集集合上的操作结果。考虑将后一个问题分开,可能只需让客户端使用更通用的集合解决方案,例如apache collection's Collections.collect()。由于A类和B类正在尝试为用户执行多项操作,因此您可以使用多种方法来处理单个项目和集合。 (值得注意的是,在像scala或groovy这样的函数式语言中,通用集合解决方案将更加优雅和简洁,减少了对这些便利方法的需求。)