2015-05-29 93 views
2

我試圖重構一個if-else鏈看起來不太好。我的常識是告訴我,我應該只能打電話給我的方法一次,但我無法找到一個優雅的方式來做到這一點。目前我所擁有的是:如果和如果做同樣的事

if(condition1) 
    do method1; 
else if(condition2) 
    do method1; 

看起來很醜陋。有重複的代碼!我能想出的最好的是:

if(condition1 || (!condition1 && condition2)) 
    do method1; 

但是,這也很糟糕,因爲我否定後condition1或者,這似乎是不必要的...

我做了一個真值表如下:

c1| c2| r 
0 | 0 | 0 
0 | 1 | 1 
1 | 0 | 1 
1 | 1 | 1 

而如果有人有興趣,我在現實生活中的問題是,我得到了2個intances Fancytree的JavaScript和我想要一些規則設置爲它們之間傳輸的節點。樹中只能孤獨的節點轉移到樹B,而B樹可以自由重新排序本身,所以我把這個B樹的dragDrop事件:

if(data.otherNode.tree === node.tree){ 
    data.otherNode.moveTo(node, data.hitMode); 
} 
else if(!data.otherNode.hasChildren()){ 
    data.otherNode.moveTo(node, data.hitMode);    
} 
+1

是否有一個否定第二個代碼中的第一個條件的一點?如果condition1給出true,它將不會進入condition2,如果它返回false,它會去檢查condition2。 – SEJBR

+0

你在第一個代碼片段中有一個簡單的'OR'。 – dasblinkenlight

+2

真相表對我來說似乎不對,你能檢查嗎? –

回答

3

您可以更加簡化 - 如果第一個條件是true時,方法應該被調用而不管第二個條件是。所以重構代碼中的!condition1是多餘的。相反,您可能只有:

if(condition1 || condition2) 
    do method1; 

在現代編程語言中,if條件甚至會短路。這意味着當第一個條件評估爲true時,第二個條件甚至不會被評估。

+0

這就是我要說的。 – Belicosus

+0

你是對的。我覺得我沒有什麼可怕的東西,浪費了每個人的時間。我覺得很愚蠢。抱歉。 – bpromas

1

你的建議是什麼,

if(condition1 || (!condition1 && condition2)) 
    do method1; 

在邏輯上是一樣的

if(condition1 || condition2) 
    do method1; 

所以我認爲這是你最好的答案。

這不是邏輯上與您的真值表雖然如此,無論是你的真理表或當前的代碼是錯誤的,如果真值表r爲意思做 do method1;

1

在寫

if (condition1 || condition2) { 
    //code1 
} 

如果條件1是正確的,則執行代碼1,並且如果條件1不正確,則只檢查條件2並且代碼相應地繼續。因此,它會是相同的

if (condition1) { 
    //method1 
} else if (condition2) { 
    //method1 
} 
相關問題