2012-06-28 110 views
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(); 

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

如何编写更清晰高效的代码?我试图与或条件,这样的事情:

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

我需要调用每种方法。

+1

也许:http://codereview.stackexchange.com/? –

+0

谢谢,我来看看。 – HBv6

+4

java编译器通常会做很多优化,所以我会保留一段这样的代码,而不是简短的可读性。 – jayeff

回答

6

您没有指定是否每个方法都有被调用,但似乎您想要全部调用它们而不管个别结果。所以使用简单或运算符:| (不是简短的 电路或||)。

if (!(p.cap() | p.email() | p.isbn() | p.number() | p.phone() | 
    p.price() | p.time() | p.url() | p.zip() | p.creditcard() 
    )) { 
     p.standard(); 
} 
2

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

但要返回你正在寻找...然后从地方把它叫做值p对象上的新方法,所有这代码现在。

int n = p.getPopulatedColumns(); 

那么该方法内,它不事关这么多的实现是什么 - 因为读者会知道的意图。

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

还有另外一个很优雅的解决方案海事组织。

创建一个validate方法是这样的:

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

因为验证方法将布尔值作为variadics你可以添加尽可能多的(或尽可能少的)参数。

或许可以简化返回一个布尔值,如果所有的参数都是假的:

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

,如果你需要稍后或不n变量要看。