我按照以下方式提供了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服务和参数必须在任何地方进行更改。
你可以给我一些建议吗?比如某种设计模式,例如:)答案 0 :(得分:2)
虽然很难确切地说如何改进此代码,但您可以考虑一些事项。一般来说,如果一个方法占用了这么多参数,你可以把它分解成更小的方法。您的方法很可能做了太多事情。此外,您似乎将DoMyMethod
对象视为函数而不是对象。尽管在某些情况下这很好,但它会增加额外的抽象层次,这可能会使您的代码难以维护。
我的建议是尝试将代码分解成更小的部分,每个函数只有1或2个事情要做。