我是编程新手。我有一个我要验证的对象列表(不是短路,而是每个都运行验证规则列表)。
最初我有一个巨大的if / else语句,但它看起来不太漂亮。我认为这样的事情会更好:
foreach (object: objects) {
foreach (rule: validationRules) {
try {
rule.validate(object)
} catch {
// Write to log
// Increment counter for rule
}
}
}
我只是不知道如何创建验证规则。我想使用Java 8谓词,因为我听说我应该使用它,但我不知道如何去做。我想我可以创建一个包含规则的接口,然后创建每个规则的实现以及规则列表。这听起来像是解决这个问题的好方法吗?
谢谢!
答案 0 :(得分:0)
你的for循环是一个非常好的主意。
谓词的想法取决于这是否是一种有效的方式来做任何你的意思验证。我通常建议人们在开始问题之前不要将自己锁定在特定的“必须使用X”的思维方式中。计划使用最简单和/或最有效的东西,但专注于一个特定的功能会导致一种“试图用锤子”的心态。
谓词不需要循环,但我认为不会是性能的好选择,因为如果你使用它们来过滤它们会创建新的对象集合,这是一个可能很昂贵的操作。作为一种方法的简单规则(如您自己的草图所示)似乎更简单,无论是在概念上还是作为代码维护。
答案 1 :(得分:0)
我认为您可以使用Predicate
来实施规则。因为Predicate
是一个抽象方法,所以可以使用简单的lambda来实现它,并且可以使用Predicate
列表来准备验证器。
public final class Validator {
private final List<Predicate<MyObject>> rules;
public final Validator(List<Predicate<MyObject>> rules) {
this.rules = rules;
}
public final validate(MyObject object) {
return rules.stream()
.map(Predicate::test)
.findAny(Boolean.FALSE).isPresent();
}
}
你可以用你需要的任何东西作为lambdas初始化课程。
接下来的问题是,您是想从多个故障中收集故障,将它们全部报告在一起,还是仅在第一次故障时停止。根据您的具体情况,有很多选择。您可以使用异常或者可以传递某种类型的故障收集器。
答案 2 :(得分:0)
我正在考虑使用谓词来验证项目中的对象,并且我遇到了这个精彩链接https://gtrefs.github.io/code/combinator-pattern/。 实质上, 在仔细阅读本教程之后,我改变了我编写的代码的很多部分。首先,正确使用谓词会使SRP脱颖而出,这绝对是前进的方式。我编写了一个使用谓词对象的简单验证器,并在https://github.com/Raveesh/QuickProgramsForFun/tree/master/javaValidators发布了它 好吧,它对你有用