0

此方法为表单中的每个文本字段调用不同的验证方法,并且 Map 中的 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;
}

或者只是摆脱整数:

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 回答