0

一般的な検証関数を考えてみましょう。

private static void check(int[][] m1, int[][] m2, char op) {
    if (m1 == null || m2 == null) {
        throw new NullPointerException("No input matrix should be null.");
    }
    /**
     * Switch case was thought to be beneficial in case of future extensibility.
     * http://en.wikipedia.org/wiki/Switch_statement#Advantages_and_disadvantages
     */
    switch (op) {
        case 'a' : if (m1.length != m2.length && m1[0].length != m2[0].length) throw new IllegalArgumentException("bla bla"); else break;
        case 'm' : if (m1[0].length != m2.length) throw new IllegalArgumentException("bla bla"); else break;
    }
}

ここで、「a」が渡された場合、検証により行列が乗算に適していることが確認され、m が渡された場合は加算に適しています。ただし、このコードにはいくつかの抜け穴があります。たとえば、1. クライアントはパラメーターとして何を渡すかを認識する必要があります。2. クライアントは間違った文字を渡す可能性があります。グローバル定数または列挙型が私の可能な解決策です..この問題を解決するためのより良い/より一般的な方法はありますか? ありがとう、

4

2 に答える 2

3

グローバル定数を使用すると、不正な値を簡単に渡すことができるため、列挙型はグローバル定数よりもはるかに優れています。私はあなたの値がints になると仮定しているので、ユーザーは任意のint. 列挙型は型チェックを行うので、それはプラスです。

ただし、これを 2 つの異なる方法にリファクタリングしてみませんか: checkMultvs checkAdd? これらはまったく異なるチェックを行っているため、(私が見る限り)異なる方法であってはならない理由はありません。

于 2013-07-06T00:24:24.520 に答える
1

2 つのまったく異なるものをチェックする 1 つのメソッドを記述しないでください。これは、乗算用と加算用の 2 つの方法である必要があります。

于 2013-07-06T00:24:34.400 に答える