2012-06-28 109 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變量要看。