我有几个方法需要按顺序运行。他们都住在同一个班级。像这样构造它们会更好吗?
public class Test{
public Test(){
foo1();
}
private void foo1(){
//do stuff
foo2();
}
private void foo2(){
//do stuff
foo3();
}
private void foo3(){
//do stuff
}
}
或者这个。
public class Test{
public Test(){
doFoo();
}
private void doFoo(){
foo1();
foo2();
foo3();
}
private void foo1(){
//do stuff
}
private void foo2(){
//do stuff
}
private void foo3(){
//do stuff
}
}
哪种方式会更清楚?我倾向于第二个例子,但我不确定是否有一种只调用其他方法的方法是最好的做法。
答案 0 :(得分:3)
我认为这取决于操作。如果操作foo2是foo1的一部分,那么你应该从foo1调用foo2。
如果foo1和foo2不相关且只是foo操作的一部分,那么从foo中调用这两个。
这取决于调用层次结构更清晰,因此更容易理解的方法的语义。
答案 1 :(得分:2)
第二个例子由于多种原因更好。
首先,您可以编写单元测试来测试foo1
,foo2
和foo3
。使用第一种方法,您只能对foo1
进行单元测试。
其次,如果将来你必须改变你的通话顺序,第二种解决方案会更好。
答案 2 :(得分:0)
这完全取决于这些方法的作用。
如果他们真的需要按顺序完成三个步骤,那么版本2会更好。
但如果它们是“嵌套”步骤foo2
是foo1
中需要完成的工作的一部分,那么版本1会更好。
第二种情况的示例:writeJavaBeanToFile
将bean转换为Map,然后调用writeJavaMapToFile
,将Map转换为字符串并调用writeStringToFile
。
答案 3 :(得分:0)
我可以看到这两种方法各有利弊。就可读性而言,第二个例子更容易理解。有一个例子,第一个可能有用。
public class Test{
public Test(){
foo1();
}
private int foo1(){
//do stuff
if(something went wrong) return -1;
foo2();
return 0;
}
private int foo2(){
//do stuff
if(something went wrong) return -1;
foo3();
return 0;
}
private int foo3(){
//do stuff
if(something went wrong) return -1;
return 0;
}
}
根据您要执行的foo3
,无论是否发生错误,第二个示例都会更好。如果您只想在foo3
成功时执行foo2
,则第一种方法可能会有用。
答案 4 :(得分:0)
你应该遵循第二种方法,它也是一种模式 - 外观模式。您基本上希望按顺序执行3个操作,并且如果将这些3对1方法映射,则调用会变得更加简单。这就是Facade模式所做的事情 - 简化了调用界面。