2017-06-22 9 views
-1

に次のように私は春のサービスを作った:リファクタリング本当に複雑な方法(春)

@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」」他の多くが含まれていますそれは別の部分を分離します

@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 

} 

私は私の「partX」方法で、実際に侵襲的であり、複雑名前を持つ多くの引数(A、B、C、D ...)を、持っています。

だから、これらの引数をすべて含むオブジェクトに追加します。私はこのメソッドをすべてのメソッドに渡すのではなく、このオブジェクトを使用して起動します。終わり

@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あなたはbruhをしているの?!」

ジョブを実行する他のクラスを追加すると便利ですが、Spring @Autowiredサービスと引数はどこでも変更する必要があります。

お願いします。たとえば、ある種のデザインパターンのように:

+6

私は個人的にはこれがもっとhttps://codereview.stackexchange.com/質問だと思っています。 – LazerBanana

答えて

2

このコードを改善する方法は正確には言い難いですが、考慮できる点はいくつかあります。一般に、メソッドが非常に多くのパラメータを取っている場合は、おそらくそれをより小さなメソッドに分解することができます。あなたの方法はあまりにも多くのことをしている可能性が非常に高いです。また、オブジェクトではなく関数としてDoMyMethodオブジェクトを扱っているようです。これは場合によっては問題ありませんが、抽象レイヤーが余分に追加され、コードを維持するのが難しくなります。

私の助言は、コードを小さな部分に分割し、それぞれの機能が1つか2つしかないことです。

関連する問題