2014-12-02 56 views
1

哪個更適合最佳實踐/效率?鏈接的AND或鏈接的OR最佳實踐

if (x == 1 
    && y == 1 
    && z == 1) 
{ do things } 

if (x != 1 || 
    y != 1 || 
    z != 1) 
{ don't do things and go to a different bit of logic.} 

是否有效率,當短路AND和OR有什麼區別?當需要做出多個邏輯斷言時,是否(通常)更好地檢查正面或負面?

+4

你沒有測試相同的條件。 – Mena 2014-12-02 09:00:41

+3

最好的做法是測試'積極'。例如'x == 1'比'x!= 1'更好,'something.isEmpty()'比'!something.isEmpty()'更好。但那只是因爲閱讀時更容易理解。 – GameDroids 2014-12-02 09:02:13

+0

你是對的,我不是。我會換個話。 – 2014-12-02 09:02:44

回答

2

對於代碼的純優化這取決於逐案。這種情況平均而言會進行最少量的比較。

對於代碼設計,它也是個案。 if-cases應該與您實際尋找的內容相匹配。例如,測試字符串輸入是否正確的函數。 (測試編寫)

public boolean isValidString (string s) { 

    if (s.isEmpty()) 
     return false; 

    if (s.length() < 12) 
     return false; 

    if (s...) 
     return false 

    return true; 
} 

在這種情況下,最合乎邏輯的方法是||。它可以寫。

public boolean isValidString (string s) { 

    if (s.isEmpty() || s.length() < 12 || s...) 
     return false; 

    return true; 
} 

http://en.wikipedia.org/wiki/De_Morgan%27s_laws這可能被重寫爲不和。然而,它不是我們想要測試的,即使它們產生相同的結果。

所以堅持一般情況下的邏輯方法。

1

如果您考慮效率問題,那麼請考慮每種情況的發生頻率。最有可能的一個應該放在前面,這樣整個表達立即被短路。

0

更好地使用「==」而不是「!=」。

這也推薦與PMD一起使用。

以下內容很好,可提高可重寫性。

If(true){ 
// 
    }else{ 
// 
    } 

If(!true){ 
// 
    }else{ 
// 
    } 
+0

我想說這取決於。在某些情況下,您想測試它是否與值分離。然後使用'!='運算符是正確的。 – Emz 2014-12-02 09:18:03

0

那麼,在某些JVM實現中,boolean值在中存儲爲JVM中的整數。 int1含義trueint0含義false。此外,處理器級別的比較邏輯依賴於架構。有些機器可能會減去2個操作數,然後添加然後進行比較,其他機器可能會逐字節比較等。因此,除非您正在查看特定的硬件架構(對於Java編程語言,您不應該這麼做),但是,我不認爲這很重要..

+0

這是不正確的。 http://stackoverflow.com/questions/383551/what-is-the-size-of-a-boolean-variable-in-java應該指出的是,它可以從JVM轉到JVM。 – Emz 2014-12-02 09:19:49

+0

@Emz - 你的意思是表示布爾值? – TheLostMind 2014-12-02 09:23:32

+0

@Emz - 來自[oracle jvm spec](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.3.4)。 *儘管Java虛擬機定義了一個布爾類型,但它只提供非常有限的支持。沒有專用於布爾值操作的Java虛擬機指令。相反,Java編程語言中操作布爾值的表達式被編譯爲使用Java虛擬機int數據類型的值。* – TheLostMind 2014-12-02 09:25:20