2013-02-10 103 views
-1

我碰到一個程序是一些具有特殊的輸出中,我有幾個if語句是這樣的:||和&&在一個單一的if語句

if((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border) 
    && (m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited)){ 
    check = true; 
} 

哪裏我都& &和||在相同條件下使用。如果getLeft()中的單元格是牆或邊框,並且getBelow()中的單元格是打開或訪問的,我希望布爾檢查爲真。

這段代碼,我現在編寫的方式,是否正確執行此檢查?也許更重要的是,寫這樣的陳述是否可憐的形式?將它分成兩個陳述會更好嗎?

我不確定我看到的特性是由這些語句還是別的,我的問題更多的是關於一般性的最佳實踐。

編輯:謝謝你的所有輸入。我很懷疑(這太複雜了),這就是爲什麼我按照我的方式構思了我的問題。

EDIT(一年後,回頭看)(重述以上更發奮)對上帝的愛,不要寫類似於上面的if聲明任何東西。如果您發現自己的代碼行類似,請記住occam's razor可能比編程更適用。

+4

您的if語句非常複雜。我認爲這使得難以理解。我認爲您需要的REAL解決方案是將其分解爲兩個if語句,或者重構您的方法以不需要這種複雜化。 – theJollySin 2013-02-10 06:11:17

+2

我看不到這裏的複雜性或真正的問題。如果前兩個條件中的任何一個解析爲「真」,並且後兩個條件中的任何一個解析兩個「真」......則將「檢查」設置爲「真」。這是一個非常基本的if語句。 – 2013-02-10 06:20:25

回答

1

你的複雜if語句可以重構爲:

if((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border)) { 
    if((m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited)){ 
     check = true; 
    } 
} 

感謝@Makoto:

check = ((m.getLeft(position).state == position.state.wall || m.getLeft(position).state == position.state.border)) && ((m.getBelow(position).state == position.state.open || m.getBelow(position).state == position.state.visited)); 

而你的代碼,以及這個代碼「作品」。

但是,請記住,請遵守Java風格指南中提到的命名約定。我不知道你的代碼中有什麼m。必須避免這種命名對象引用。另外,state似乎是你班上的public字段(假設)。這種公共訪問領域也應該避免。請使用getters()setters()

+0

...爲什麼不直接將'check'賦值爲布爾比較的結果...? – Makoto 2013-02-10 06:25:41

+0

@Makoto是的,也將這樣做。 – 2013-02-10 06:26:09

1

它在我看來它正確執行,但它很難閱讀。

如果你打算在if語句中使用&&,那麼你可以嵌套一個新的if語句,它在大多數情況下基本上是一樣的。

+0

如果有一個else語句,它就不一樣了,您將不得不復制該代碼以獲得相同的效果。 – Arjan 2013-02-10 06:24:38

+0

@Arjan在那裏你會使用一個重複代碼的else語句 - 如果我理解你的話,你最好使用'||'。但即便如此,這就是爲什麼我在大多數情況下基本上說,而不是絕對。 – Enfyve 2013-02-10 06:27:14

1

打破你的布爾語句時,它讀取像這樣:

(a == x_1 || a == x_2) && (b == x_3 || b == x_4) 

不幸的是,這是爲特定的布爾聲明會得到一樣簡單。有選擇,使疼痛輕鬆了不少:

  • 重構你的代碼並不需要這樣複雜的語句,通過將其分成兩個if塊(在我的重構圖所示),或
  • 提取物作爲一種方法並將返回值分配給check。老實說,它要麼是真的,要麼是假的。

下面是一個重構方法的例子。我不知道是什麼m恰恰是:

public boolean isCheck(M m, Position p) { 
    boolean retVal = false; 

    if(m.getLeft(p).state == p.state.wall || m.getLeft(p).state == p.state.border)) { 
     if((m.getBelow(p).state == p.state.open || m.getBelow(p).state == p.state.visited)) 
      retVal = true; 
     } 
    } 

    return retVal; 
} 

// call it as such 

check = isCheck(m, position); 
1

使用另一個IF insted的使用&&的:

if(m.getLeft(position).state == position.state.wall || 
    m.getLeft(position).state == position.state.border){ 
    if(m.getBelow(position).state == position.state.open || 
     m.getBelow(position).state == position.state.visited){ 
     check = true; 
    } 
} 
+0

這是......完全一樣的東西。 – 2013-02-10 06:23:17