に次のように私は春のサービスを作った:リファクタリング本当に複雑な方法(春)
@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サービスと引数はどこでも変更する必要があります。
お願いします。たとえば、ある種のデザインパターンのように:
私は個人的にはこれがもっとhttps://codereview.stackexchange.com/質問だと思っています。 – LazerBanana