0

このメソッドは、フォーム内のテキストフィールドごとに異なる検証メソッドを呼び出し、マップ内のint []配列は、テキストフィールドで実行する検証のメソッドまたはタイプを決定します。しかし、この方法の循環的複雑度は10です。より良い代替案や、このコードを改善するために何ができるかを提案してください。

public final boolean validateFields(final HashMap<JTextField, int[]> textFieldMap) {
        boolean flag = false;
        for (Map.Entry<JTextField, int[]> entry : textFieldMap.entrySet()) {
            JTextField field = entry.getKey();
            for (int constant : entry.getValue()) {
                switch (constant) {
                    case Constants.VAL_CHAR : flag = validateChar();
                        break;
                    case Constants.VAL_DATE : flag = validateDate();
                        break;
                    case Constants.VAL_DUPLICATE : flag = validateDuplicate();
                        break;
                    case Constants.VAL_EMAIL : flag = validateEmail();
                        break;
                    case Constants.VAL_LENGTH : flag = validateLength();
                        break;
                    case Constants.VAL_NUMERIC : flag = validateNumeric();
                        break;
                    case Constants.VAL_STRING : flag = validateNumeric();
                        break;
                    default : flag = validateNotNull();
                        break;
                }
            }
        }
        return flag;
    }
4

1 に答える 1

2

これがあなたのケースに当てはまるかどうかはわかりませんが、int定数の代わりに列挙型を使用できます。

public enum Constants {

    VAL_CHAR {
        public boolean validate() {
            return validateChar();
        }
    },
    VAL_DATE {
        public boolean validate() {
            return validateDate();
        }
    },
    ...
    ;

    public abstract boolean validate();

}

次に、次のようにコードをリファクタリングできます。

public final boolean validateFields(final HashMap<JTextField, int[]> textFieldMap) {
    boolean flag = false;
    for (Map.Entry<JTextField, int[]> entry : textFieldMap.entrySet()) {
        JTextField field = entry.getKey();
        for (int constant : entry.getValue()) {
            Constants enumConstant = ...; //mapping from int if you need to keep ints
            flag = enumConstant.validate();
        }
    }
    return flag;
}

または、intを削除します。

public final boolean validateFields(final HashMap<JTextField, Constants[]> textFieldMap) {
    boolean flag = false;
    for (Map.Entry<JTextField, Constants[]> entry : textFieldMap.entrySet()) {
        JTextField field = entry.getKey();
        for (Constants constant : entry.getValue()) {
            flag = constant.validate();
        }
    }
    return flag;
}

PS:現在のコードではflag = flag && validateXXX()、最後にチェックされたフィールドに対応するフラグのみを返したい場合を除いて、おそらく意味します。

于 2012-07-16T17:25:11.433 に答える