构建课程

时间:2015-10-27 13:55:01

标签: java

我有几个方法需要按顺序运行。他们都住在同一个班级。像这样构造它们会更好吗?

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
    }

}

哪种方式会更清楚?我倾向于第二个例子,但我不确定是否有一种只调用其他方法的方法是最好的做法。

5 个答案:

答案 0 :(得分:3)

我认为这取决于操作。如果操作foo2是foo1的一部分,那么你应该从foo1调用foo2。

如果foo1和foo2不相关且只是foo操作的一部分,那么从foo中调用这两个。

这取决于调用层次结构更清晰,因此更容易理解的方法的语义。

答案 1 :(得分:2)

第二个例子由于多种原因更好。

首先,您可以编写单元测试来测试foo1foo2foo3。使用第一种方法,您只能对foo1进行单元测试。

其次,如果将来你必须改变你的通话顺序,第二种解决方案会更好。

答案 2 :(得分:0)

这完全取决于这些方法的作用。

如果他们真的需要按顺序完成三个步骤,那么版本2会更好。

但如果它们是“嵌套”步骤foo2foo1中需要完成的工作的一部分,那么版本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模式所做的事情 - 简化了调用界面。