-1

みなさん、こんにちは。私は2つのJavaプログラムに取り組んでいます。文字通り、2つの違いは、2次元配列を定義するbeginningステートメントだけです。以下の例では、コードを大幅に短縮しています。

public class Qwerty {
    /** this is what needs to be replaced */
    private static char master[][] = {
        QwertyKbd.lIndex,
        QwertyKbd.lMiddle,
        QwertyKbd.lRing,
        QwertyKbd.lPinky,
            /** and so forth in this fashion */
    };

    public static int[] analyze(String file) {
    }

    public static void split(char c) {
    }
}

そしてここの2番目のクラス:

 public class Dvorak{
        /** this is what needs to be replaced */
        private static char master[][] = {
            /** various definitions, eliminated for conciseness */
        };

        public static int[] analyze(String file) {
            /** this is the same*/
        }

        public static void split(char c) {
            /** this is the same*/
        }
    }

問題は、唯一の違いが「マスター」2次元配列である1つのクラスを取得するためにどのようにリファクタリングできるかということです。フックメソッドなどはここではばかげているでしょう。プログラムが行うことで変更が必要なことは何もないからです。どう思いますか?

4

2 に答える 2

2

これは継承の典型的なケースのようです。継承の本当の目的はコードの再利用です。これはまさにここで得られるものです。すべてのメソッドを非静的にし、それらに対して「Extract Superclass」を実行して、抽象クラスにプルインanalyze()split()、抽象クラスなどを追加しgetMaster()ます。各クラスは、適切な値を返すためにオーバーライドします。

いくつかの理由で、しかし主にそれがあなたを「静的な土地」に残すというより悪い選択肢は、単にあなたの「共有」を収容する場所であるいくつかの第3のクラスにanalyze()移動することですsplit()これらのようなユーティリティメソッド。

于 2012-12-16T03:08:41.940 に答える
1

クラスが異なるプロジェクトにある場合はそれを行うことはできませんが、クラスがプロジェクトの一部である場合は、抽象クラス、またはすべてのクラスのスーパークラスを作成できます:Qwerty、Dvorak ...たとえば、抽象を作成します

public class CustomAbstract{
    protected char master[][];
    public int[] analyze(String file){return null;};
    public void split(char c){};
}

次に、クラスで、この抽象クラスを拡張します

public class Qwerty extends CustomAbstract{
    public Qwerty(){
        //master = ...;
    }
    //your code
}

CustomAbstractでマスターフィールドをリファクタリングすると、他のクラスのすべてのマスターもリファクタリングされます。

上記のコードの問題は、静的メソッドの分析などを行っても、静的フィールドマスターを使用できないことです。クラス内のすべてのメソッドとフィールドが静的である必要がある場合は、単一のスケルトンパターンを使用できます。各クラスで、次のような静的メソッドを作成します

public class Qwerty extends CustomAbstract{
    //your code
    static Qwerty instance = new Qwerty();
    public static Qwerty getInstance(){
        return instance;
    }
}

次に、Qwerty.analyze(String)を使用する代わりに、Qwerty.getInstance()。analyze(String)を使用できます。

于 2012-12-16T03:44:02.470 に答える