此代码工作正常,但我需要简化它以获得更清晰,并希望更高效:
int i = 0;
if (p.cap()) n++;
if (p.creditcard()) n++;
if (p.email()) n++;
[...]
if (p.price()) n++;
if (p.url()) n++;
if (p.zip()) n++;
if (n == 0) p.standard();
正如代码所说,我需要调用多个方法(我不知道它们的有限数量)。每个 p。()*方法返回一个布尔值,仅当返回的值为true时, n 才会递增。如果n == 0(当调用EVERY方法返回false时会发生这种情况)那么我需要调用 p.standard()。
如何编写更清晰有效的代码?我尝试使用或condition ,如下所示:
if (!( p.cap() || p.email() || p.isbn() || p.number() || p.phone() ||
p.price() || p.time() || p.url() || p.zip() || p.creditcard()
)) {
p.standard();
}
但显然它没有正常工作(例如:如果p.cap()返回true,则不调用其他方法。)
我需要调用每个方法。
答案 0 :(得分:6)
您没有指定是否每个方法都有被调用,但似乎您想要将它们全部调用,而不管个别结果如何。所以使用简单或运算符:| (不是短暂的 电路或||)。
if (!( p.cap() | p.email() | p.isbn() | p.number() | p.phone() |
p.price() | p.time() | p.url() | p.zip() | p.creditcard()
)) {
p.standard();
}
答案 1 :(得分:3)
使用一些样板文件,您可以将其抽象为某种验证器接口:
interface Validator {
boolean validate(Foo p);
}
Validator[] validators = new Validator[] {
new Validator() { boolean validate(Foo p) {return p.cap();} },
new Validator() { boolean validate(Foo p) {return p.creditcard ();} },
new Validator() { boolean validate(Foo p) {return p.email();} },
// …
}
public int validateAll(Foo p, Validator[] validators) {
int valid = 0;
for (Validator v : validators) {
if (v.validate(p)) valid++;
}
return valid;
}
if (validateAll(p, validators)) p.standard();
这是代码的净增长,但它具有清楚地传达“在p
上运行所有这些检查”的优点,并且检查列表是可扩展的。
(我承认这可能很容易成为一种对你的需求来说过于沉重的解决方案。)
答案 2 :(得分:2)
这里真的很难 - 没有足够的背景......
但是在p对象上创建一个新方法,返回你要查找的值...然后从现在所有这些代码的地方调用它。
类似
int n = p.getPopulatedColumns();
然后在该方法中,实现的内容并不重要 - 因为读者会知道意图。
答案 3 :(得分:2)
IMO还有另一个非常优雅的解决方案。
创建一个这样的验证方法:
public static int validate(boolean ... booleans) {
int n = 0;
for (boolean b : booleans) {
if (b) n++;
}
return n;
}
然后你可以像这样调用这个方法:
int n = validate(p.cap(), p.creditcard(), p.email());
if (n == 0) p.standard();
由于validate方法将布尔值作为可变参数,你可以根据需要添加任意数量的(或很少的)参数。
或者,如果所有参数都为false,您可以简化返回布尔值:
public static boolean validate(boolean ... booleans) {
int n = 0;
for (boolean b : booleans) {
if (b) n++;
}
return 0 == n;
}
这取决于您以后是否需要n
变量。