使用许多验证方法构建的最佳方法

时间:2015-10-23 12:38:50

标签: java design-patterns

这是我的代码

public class Validator {
private String message = "ok";

public String mainValidate(String value) {
    if(!isAccept1()) {
        message = "fail1";
        return message;
    }

    if(!isAccept2()) {
        message = "fail2";
        return message;
    }

    if(!isAccept3()) {
        message = "fail3";
        return message;
    }
    return message;
}

public boolean isAccept1() {}

public boolean isAccept2() {}

public boolean isAccept3() {}

要求是:如果代码遇到任何错误,请立即返回消息。 正如您所看到的,使用当前代码,我非常重复自己。 我如何构建代码并仍然保持要求。如果发生任何错误,代码将跳过其他验证并返回错误消息

非常感谢!

3 个答案:

答案 0 :(得分:3)

您可以将所有检查放在一个方法中:

public String mainValidate(String value) {
    String message = isAccept();
    if(!message.equalsIgnoreCase("ok")) {
        return message;
    }
}

private String isAccept() {
    String returnString = "ok";
    //check1 - change returnString to whatever message if check fails
    //check2 - change returnString to whatever message if check fails
    //check3 - change returnString to whatever message if check fails
    //etc...
    return returnString;
}

答案 1 :(得分:1)

您可以将动作/消息存储在地图中并对其进行迭代:

private static final Map<Predicate<String>, String> VALIDATIONS = new LinkedHashMap<> ();

static {
  VALIDATIONS.put(Validator::isAccept1, "fail1");
  VALIDATIONS.put(Validator::isAccept2, "fail2");
  //etc.
}

public String mainValidate(String value) {
  for (Entry<Predicate<String>, String> v : VALIDATIONS.entrySet()) {
    Predicate<String> validator = v.getKey();
    String errorMsg = v.getValue();
    if (!validator.test(value)) return errorMsg;
  }
  return "ok";
}

public static boolean isAccept1(String value) { return /* ... */; }

答案 2 :(得分:1)