2010-04-07 88 views
12

我有這些長的聲明,我將在這裏指x,y等。 我的條件語句的結構是這樣的:if-else結構

if(x || y || z || q){ 
    if(x) 
     do someth 
    else if (y) 
     do something 

    if(z) 
     do something 
    else if(q) 
     do something 
} 
else 
    do smthing 

有沒有寫這個東西更好,更短的辦法嗎?謝謝

回答

1

這對我來說似乎很清楚(並且清楚是好的)。

你可以做的是先評估x,y,z和q並將它們存儲爲變量,這樣你就不必這樣做了兩次。

+3

@Thirler 嗯,這將擊敗短路的目的評價。我認爲平均假設x,y,z和q的概率和時間複雜度相等,這將是性能提升。但是如果z的概率是50%並且幾乎不需要處理,而q的概率是1%並且需要95%的處理能力呢? 看看如果沒有適當的指標,微型優化如何讓你陷入困境? – 2010-04-07 07:30:41

+0

是的,我們需要使用至多一個變量來執行該檢查 – Halo 2010-04-07 07:35:35

+0

@Tim您需要非常長的條件(或執行數百萬次的代碼),因爲這是一個性能消耗。我當然不是在優化(這個問題不談論它),我建議提高可維護性。如果性能很重要,則需要透明地緩存計算結果(將其隱藏在存儲結果的函數之後)。請注意,給出的示例執行一些條件兩次。但是一個很好的規則是在你看到需要大量時間來執行之前不會進行優化。 – Thirler 2010-04-07 07:38:47

1

也許這是一個更容易閱讀。但現在你會執行一次額外的檢查。如果不是關鍵任務的代碼,那麼也許你可以使用以下命令:

if (x) 
    do something; 
else if (y) 
    do something; 

if (z) 
    do something; 
else if(q) 
    do something; 

if !(x || y || z || q) 
    do something completely different. 
+2

你最後的陳述與問題中的不一樣,我認爲你需要'if(x || y || z || q)' – Thirler 2010-04-07 07:19:54

+0

並且使用else可以讓我更好地閱讀。你知道,確保我們沒有留下漏洞 – Halo 2010-04-07 07:22:28

+0

我不明白這是如何「執行一次額外的檢查」。你有相同數量的if語句,畢竟:) – 2010-04-07 07:26:41

4

我沒有看到一個很大的問題,你現在怎麼寫。 我甚至建議使用花括號來表示單個語句if塊。這將有助於避免在以後需要添加更多代碼行的情況下出錯(並且可能會忘記添加大括號)。我發現它也更具可讀性。 的代碼應該是這樣的,那麼:

if (x || y || z || q) { 
    if (x) { 
     do something 
    } else if (y) { 
     do something 
    } 

    if (z) { 
     do something 
    } else if (q) { 
     do something 
    } 
} else { 
    do something 
} 
+0

使用大括號+1。我希望Java,C++和其他語言能夠完成「Go」所做的事情,並使這些大括號成爲強制性的......它肯定會讓代碼變得更加可讀。 – 2010-04-07 08:09:50

+0

是的,我總是使用花括號,上面的只是一個原型或其他東西。 – Halo 2010-04-07 08:22:53

0

我不建議如下,其實我覺得你得到了什麼是好的,但:

s = true; 
if (x) { 
    do something; 
    s = false; 
} else if (y) { 
    do something; 
    s = false; 
} 
if (z) { 
    do something; 
    s = false; 
} else if (q) { 
    do something; 
    s = false; 
} 

if (s) { 
    so something; 
} 
4

避免多重另一種變化檢查和errorprone複雜的邏輯表達式可能是:

boolean conditionhandled = false; 
if (x) { 
    do something 
    conditionhandled = true; 
} else if (y) { 
    do something 
    conditionhandled = true; 
} 

if (z) { 
    do something 
    conditionhandled = true; 
} else if (q) { 
    do something 
    conditionhandled = true; 
} 

if (!conditionhandled) { 
    do something 
} 
+1

謝謝,我認爲我們需要初始化條件爲false – Halo 2010-04-07 07:26:09

+0

哎呀!謝謝,我解決了這個問題。 – 2010-04-07 09:34:12

0

你可以對x,y,z,q做一些假設嗎? e.G.其中只有一個是真的。比你能看到它作爲一個國家

enum State { 
X{ 
    void doSomething(){ 
    doItTheXWay(); 
    } 
}, 
Y{ 
    void doSomething(){ 
    doItTheYWay(); 
    } 
}, 
Z{ 
    void doSomething(){ 
    doItTheZWay(); 
    } 
}, 
Q{ 
    void doSomething(){ 
    doItTheQWay(); 
    } 
}; 
    void doSomething(){ 

    } 
} 

,並在你的代碼,你使用的if語句

,你可以指定一個狀態,只是做正確的事

State state = getAState(); 
state.doSomething(); 

如果您不喜歡枚舉State可能是一個Interface而X可能是Q來實現類。 這種情況下的好處是多次使用相同的if else構造。說,一些代碼行以後你會用

if(x) 
    do_the_next_thing_with_X(); 
... 

開始或者你可以只使用其他功能擴展您的枚舉,使一個單一的通話

state.doTheNextThing();