许多验证方法的最佳结构方式

3

这是我的代码

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() {}

需求是:如果代码遇到任何错误,立即返回消息。 如您所见,当前代码中我重复了很多次。 如何组织代码并仍保持需求。如果出现任何错误,代码将跳过其他验证并返回错误消息。

非常感谢!


这似乎是一个非常广泛的主题,大多数基于个人观点。我建议使用适合您和您的应用程序的方法。 - B001ᛦ
你已经立即返回了。我不明白你在这里试图实现什么。 - newbieee
你能推荐一种解决这个问题的方法吗? - duy
1
这个问题应该属于程序员论坛吧? 请参考这个答案 - Jude Niroshan
你可以将所有的检查放在一个方法中,然后只需调用这个方法... - brso05
3个回答

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
使用装饰器模式来处理不同类型的验证怎么样?我认为这样做会更容易应对未来出现的新类型验证。 - Jude Niroshan

2

你可以将动作/消息存储在映射中并进行迭代:

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 /* ... */; }

我会尝试您的解决方案。这对我来说是新鲜事物。 - duy


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接