优化代码以获得更高的清晰度和效率

时间:2012-06-28 11:55:22

标签: java optimization performance

此代码工作正常,但我需要简化它以获得更清晰,并希望更高效:

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

我需要调用每个方法。

4 个答案:

答案 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变量。