2011-02-24 246 views
2

他們是一種更簡單的方法來模擬此邏輯?優化嵌套if語句

如果以下任一方法返回False,那麼每個調用的方法都返回True或False,然後調用this.displayError()方法。

我想不出更簡單的模擬這個邏輯,有什麼想法?

 main: function(){ 
    if(this.isWRNotProcessed()){ 
     if(this.retriveWRMetaData()){ 
      if(this.retrieveWRLines()){ 
       this.getDistinctOrders(); 
       if(this.createNewPOs()){ 
        this.approvePOs(); 
       } else{this.displayError();} 
      } else{this.displayError();} 
     } else{this.displayError();}  
    } else{this.displayError();} 
     } 

編輯:添加一個附加else語句調用this.createNewPOs() 對此深感抱歉,並感謝所有他們都是有幫助的響應時!

也可以Try Catch語句工作在這個邏輯而不是IFs?

回答

4

這應該做你想要什麼:

main: function() { 
    if (this.isWRNotProcessed() && this.retriveWRMetaData() && this.retrieveWRLines()) { 
     this.getDistinctOrders(); 
     if (this.createNewPOs()) { 
      this.approvePOs(); 
     } 
    } else { 
     this.displayError(); 
    } 
} 
1
main: function(){ 
    if (this.isWRNotProcessed() && this.retrieveWRMetaData() && this.retrieveWRLines()){ 
    this.getDistinctOrders(); 
    if (this.createNewPOs()){ 
     this.approvePOs(); 
     return 
    } 
    } 
    this.displayError(); 
} 

還是我失去了一些東西?除非displayError具體針對故障,否則這應該適用於您的目的。

+0

唯一的問題是,如果'this.createNewPOs()'的結果是falsey,你仍然會顯示錯誤。我想你可以將'return'移到嵌套的'if()'之外。 – user113716 2011-02-24 19:03:17

+0

@patrickdw:很好的調用,沒有捕捉到嵌套的關係。是的,我可以移動回報,只是在第一回閤中錯過了。 – 2011-02-24 19:07:56

+0

+1更新的解決方案。 – user113716 2011-02-24 19:22:53

-2

也許這:

if(this.isWRNotProcessed() && this.retriveWRMetaData() && this.retrieveWRLines() &&  this.getDistinctOrders() && this.createNewPOs()) { 
    this.approvePOs(); 
} else { 
    this.displayError(); 
} 
+3

-1這不是等價的:'this.approvePOs'的調用不依賴於'this.getDistinctOrders',顯然如果this.createNewPOs失敗,'this.displayError'不應該被調用。 – Gumbo 2011-02-24 18:59:28

+0

你說得對。我錯過了。我可以回答嗎? :) – MikeTheReader 2011-02-24 21:47:19

1

可能變得更加可讀這樣的:

main: function() 
{ 
    var is_valid = 
     this.isWRNotProcessed() && this.retriveWRMetaData() && this.retrieveWRLines(); 

    if(!is_valid) 
    { 
     this.displayError(); 
     return; 
    } 

    this.getDistinctOrders(); 

    if(this.createNewPOs()) 
    { 
     this.approvePOs(); 
    }  
} 
0

簡化可讀性,我會做一個詳細的方法......這僅僅是合乎邏輯的,如果你做當this.isWRNotProcessed() && this.retriveWRMetaData() && this.retrieveWRLines()true那麼應該說明它的含義。

someCheck: function(){ // I don't know what exactly it does so call this way.. 
    return this.isWRNotProcessed() 
      && this.retriveWRMetaData() 
      && this.retrieveWRLines(); 
}, 

main: function(){ 
    if(this.someCheck()){ 
      this.getDistinctOrders(); 
      if(this.createNewPOs()){ 
       this.approvePOs(); 
      } 
    } else { 
      this.displayError(); 
    } 
}