在Java中将“主要”方法及其“辅助”方法组合在一起

时间:2013-10-17 13:52:06

标签: java coding-style refactoring

避免使用大型单片方法被认为是一种很好的做法。我个人喜欢识别所有服务于独特,明确目的的代码片段,并将它们重构为方法。这样,代码更像是一本书。

这种方法的一个明显问题是,我的班级最终会在预定范围之外提供大量方法,我觉得这是非常不受欢迎的。

有一些方法可以在Java中创建嵌套函数,但由于该语言不直接支持该功能,因此生成的代码通常难以理解 - 至少对我而言。

也可以使用嵌套类。我不喜欢这个解决方案的是它有点笨拙 - 是吗? - 当“组合在一起”中的一些涉及的方法被覆盖的方法时。

相当模糊的问题,但无论如何我想知道人们如何去做这件事。

编辑:我的意思的例子:

public class ClassWithTwoMainMethods {

    private int var1;
    private int var2;

    public void doSomething(int a) {
        if (conditionToCheck(a)) {
            doSomethingSpecific();
        }
    }

    private void doSomethingSpecific() {
        ...
    }

    private boolean conditionToCheck(int a) {
        ...
    }

    public void doSomethingElse(int a, int b) {
        doSomethingElseHelper1(a+b);
        doSomethingElseHelper2();
        doSomethingElseHelper3();
    }

    private void doSomethingElseHelper1(int arg) {
        ...
    }

    private void doSomethingElseHelper2() {
        ...
    }

    private void doSomethingElseHelper3() {
        ...
    }

}

乍一看,上面的班级有一个“主”方法,其中两个“助手”不应该在其他任何地方使用,而另一个“主要”方法有三个助手,这一点并不明显。

1 个答案:

答案 0 :(得分:1)

我为此使用“工人对象”。工作对象仅存在于方法内部,有助于实现目标。一个典型的例子是String,除了这个工人非常有用,方法经常会返回它。

所以我要做的是将工作对象中的方法分组,在公共API方法中创建它(即应该在公共API中使用和记录某些东西)并让它做到这一点:

public void doSomethingElse(int a, int b) {
    new Worker( a, b ).run();
}

这种方法有一些好处:

  1. 您可以单独测试这些工作人员。
  2. 它将代码保存在一起
  3. 有助于避免混淆类的命名空间。尽管如此,它确实会污染全局命名空间。
  4. 它允许您重复使用不同类别的工作人员。
  5. 我可以减少对工人领域的限制。对于主要类,我更喜欢不改变的字段。在工人中,字段通常更像是局部变量。这样,我可以减少方法参数的数量,但我需要编写更多的单元测试。