2

大規模でモノリシックなメソッドを避けることは、良い習慣と考えられています。個人的には、一意で明確な目的を果たすすべてのコードを特定し、それらをメソッドにリファクタリングするのが好きです。このように、コードは本のように読めます。

このアプローチの明らかな問題は、クラスが意図した範囲外で使用可能な多数のメソッドを持つことになることです。これは非常に望ましくないと思います。

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() {
        ...
    }

}

一見すると、上記のクラスには、他では使用できない 2 つの「ヘルパー」を持つ 1 つの「メイン」メソッドと、3 つのヘルパーを持つ別の「メイン」メソッドがあることがわかりません。

4

1 に答える 1

1

これには「ワーカー オブジェクト」を使用します。ワーカー オブジェクトはメソッド内にのみ存在し、目的を達成するのに役立ちます。これの典型的な例はString、このワーカーが非常に便利で、メソッドがしばしばそれを返すことを除いてです。

だから私がやっていることは、メソッドをワーカーオブジェクトにグループ化し、それをパブリック API メソッドで作成し (つまり、パブリック API で使用および文書化されるはずの何か)、それを実行させることです。

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

このアプローチにはいくつかの利点があります。

  1. これらのワーカーを個別にテストできます。
  2. 一緒に属するコードをまとめます
  3. クラスの名前空間が乱雑になるのを避けるのに役立ちます。ただし、グローバル名前空間はいくらか汚染されます。
  4. 異なるクラスでワーカーを再利用できます。
  5. 労働者の畑の制約を緩和できます。メインクラスについては、変更されないフィールドを好みます。ワーカーでは、フィールドはローカル変数に似ていることがよくあります。そうすれば、メソッド パラメーターの数を減らすことができますが、より多くの単体テストを作成する必要があります。
于 2013-10-17T14:17:13.507 に答える