重构真的很复杂的方法(Spring)

时间:2017-06-22 09:57:13

标签: java spring design-patterns refactoring

我按照以下方式提供了Spring服务:

@Service
public class MyService {

    @Autowired
    private AnotherService anotherService;

    public void reallyComplicatedMethod(A a, B b, C c, D d, E e, F f){
        // over 9000 lines of code that use anotherService
    }
}

代码看起来很简短,但它包含很多嵌套的“if”“else”到处

所以我重构它以分开不同的部分:

@Service
public class MyService {

    @Autowired
    private AnotherService anotherService;

    public void reallyComplicatedMethod(A a, B b, C c, D d, E e, F f){
        part1(a, b, c);
        part2(a, b, c, d, e, f);
        part3(a);
        // ...
    }

    private void part1(A a, B b, C c){...}
    private void part2(A a, B b, C c, D d, E e, F f){
        // imagine a lot of if else for ...
        part2_1(a, b, c);
        part2_2(d, e, f);
    }
    private void part2_1(A a, B b, C c){...}
    private void part2_2(D d, E e, F f){...}

    private void part3(A a){...}
    // other parts

}

我有更多的参数(A,B,C,D ......),复杂的名称在我的“partX”方法中是非常具有侵略性的。

所以我将它添加到包含所有这些参数的对象中。我使用这个对象来启动进程,而不是在每个方法中传递它。

@Service
public class MyService {

    @Autowired
    private AnotherService anotherService;

    public void reallyComplicatedMethod(A a, B b, C c, D d, E e, F f){
        new DoMyMethod(a, b, c, d, e, f).run();
    }

    class DoMyMethod {
        A a, B b, C c, D d, E e, F f;

        // It can also be a Builder (if there are too many parameters)
        DoMyMethod(A a, B b, C c, D d, E e, F f){
            // el famoso constructor with this.x = x;
        }

        void run() {
            part1();
            part2();
            part3();
            // ...
        }

        private void part1(){...}
        private void part2(){...}
        // sub part2
        private void part3(){...}
        // other parts
    }
}

最后,我发现“partX”方法真的很酷阅读,但架构感觉就像“wtf你在做什么?”

添加其他完成工作的类是一种方便的方法,但Spring @Autowired服务和参数必须在任何地方进行更改。

你可以给我一些建议吗?比如某种设计模式,例如:)

1 个答案:

答案 0 :(得分:2)

虽然很难确切地说如何改进此代码,但您可以考虑一些事项。一般来说,如果一个方法占用了这么多参数,你可以把它分解成更小的方法。您的方法很可能做了太多事情。此外,您似乎将DoMyMethod对象视为函数而不是对象。尽管在某些情况下这很好,但它会增加额外的抽象层次,这可能会使您的代码难以维护。

我的建议是尝试将代码分解成更小的部分,每个函数只有1或2个事情要做。