2

这段代码工作正常,但我需要简化它以提高清晰度并希望提高效率:

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();

正如代码所说,我需要调用多个方法(我不知道它们的有限数量)。每页()* 方法返回一个布尔值,并且n仅在返回的值为 true 时才递增。如果 n==0 (当调用的每个方法都返回 false 时会发生这种情况),那么我需要调用p.standard()

如何编写更清晰高效的代码?我尝试使用or 条件,如下所示:

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 则不会调用其他方法)。

我需要调用每个方法。

4

4 回答 4

6

您没有指定是否必须调用每个方法但似乎您想调用它们而不考虑单个结果。所以使用简单的或运算符:| (不是短路或||)。

if (!( p.cap() | p.email() | p.isbn() | p.number() | p.phone() |
   p.price() | p.time() | p.url() | p.zip() | p.creditcard()
    )) {
        p.standard();
}
于 2012-06-28T12:08:29.037 回答
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清楚地传达“运行所有这些检查”,并且检查列表是可扩展的。

(我承认这可能很容易成为一个对您的需求来说太重的解决方案。)

于 2012-06-28T12:11:39.010 回答
2

在这里真的很难做到 - 没有足够的背景......

但是在 p 对象上创建一个新方法,该方法返回您要查找的值......然后从所有这些代码所在的位置调用它。

就像是

int n = p.getPopulatedColumns();

然后在该方法中,实现是什么并不重要 - 因为读者会知道意图。

于 2012-06-28T12:01:27.843 回答
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 方法将布尔值作为可变参数,因此您可以根据需要添加尽可能多(或尽可能少)的参数。

或者,如果所有参数都为假,您可以简化为返回布尔值:

public static boolean validate(boolean ... booleans) {
    int n = 0;
    for (boolean b : booleans) {
        if (b) n++;
    }
    return 0 == n;
}

这完全取决于您n以后是否需要该变量。

于 2012-06-28T13:12:37.233 回答