繁体   English   中英

构建课程

[英]Structuring a class

我有几种方法需要顺序运行。 他们都生活在同一个阶级。 这样构造它们更好吗?

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
    }

}

哪种方法更清楚? 我倾向于第二个示例,但是我不确定具有仅调用其他方法的方法是否是最佳实践。

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

如果foo1和foo2是无关的,只是foo操作的一部分,则从foo中调用这两个。

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

由于多个原因,第二个示例更好。

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

第二,如果将来您必须更改呼叫顺序,则第二种解决方案更好。

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

如果确实需要依次执行这三个步骤,则版本2更好。

但是,如果它们是“嵌套”步骤,而foo2是需要在foo1完成的一部分,那么版本1更好。

第二种情况的示例: writeJavaBeanToFile将bean转换为Map,然后调用writeJavaMapToFile ,后者将Map转换为String并调用writeStringToFile

我可以看到这两种方法各有利弊。 就可读性而言,第二个示例更容易理解。 有一个示例,尽管第一个可能有用。

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而定,无论是否发生错误,第二个示例都会更好。 如果仅在foo2成功的情况下执行foo3则第一个方法可能会有用。

您应该遵循第二种方法,这也是一种模式-门面模式。 您基本上想按顺序执行3个操作,如果将这3个方法映射为1个方法,则调用会变得更加简单。 这也是外观模式的作用-简化了调用界面。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM