簡體   English   中英

如何編寫干凈的條件語句

[英]How do I write a clean conditional statement

這可能是一個愚蠢的問題,但是寫一個干凈的條件語句的簡單方法是什么,例如讓我們說如果我有一個條件語句,我只希望它在滿足要求的代碼塊之前發生,如果它不滿足要求不是那么我希望它發生在代碼塊之后。 但它必須按照這個順序發生

編輯

這段代碼沒有被破壞。我只是問是否有更好的方法來構造這個條件語句,我發現將 //random 代碼放在一個輔助方法中並將兩個 if 組合到一個 else if 中可以解決它。 看我下面的回答。

if(number === 250){
    // sameMethod()
}

//random code

if(number !== 250){
    // sameMethod()
}

解決方案

function helper() {
    //random code
}

if(number !== 250){
    helper()
    // same code
} else {
    // same code
    helper()
}
if(number == 250){
    // sameMethod()
}

//random code

if(number != 250){
    // sameMethod()
}

為此,根據手頭的信息,我建議保持代碼不變。 您編寫此代碼的方式,if-else 塊將對您的應用程序流程產生嚴重影響。

假設 randomCode 是一個方法調用,它執行下一個操作:

function randomCode() {
  this.number += 5;
}

並且您以應用程序的狀態開始代碼,該狀態的 number 值為 245。

if ( number == 250 ) { // conditions 245 == 250 evaluates to false
  // sameMethod -> will not be executed
}

randomCode(); // increases the value of number with 5

if ( number != 250 ) { // condition 250 != 250 evaluates to false
  // sameMethod -> will not be executed
}

只是打一個if-else,像這樣:

if ( number == 250 ) { // condition 245 == 250 evaluates to false
  // sameMethod
} else {
  randomCode();
  // sameMethod -> here it will be executed, even though number now is 250. Change in behaviour
}

因此,有兩件事需要考慮:要么您發布的示例代碼是正確的流程,使其正確(但最終可能會執行兩次 sameMethod,或者根本不執行,因為可以在 randomCode 部分更改 number 的值,或者 sameMethod 和 randomCode 必須(恰好)執行一次,具體取決於該條件。

如果是這樣,原始(偽?)代碼是錯誤的,但結果確實會變成:

if ( number == 250 ) {
  sameMethod();
  randomCode();
} else {
  randomCode();
  sameMethod();
}

這是 monads 和所有爵士樂展示他們丑陋杯子的地方。

假設您在談論 java,例如,您可以編寫一個runSequentially方法,該方法可以讓您編寫:

   runSequentially(() -> sameMethod(), () -> {
        // random code
   }, number != 250);

runSequentially 將首先運行第一個 Runnable,然后是第二個 Runnable - 除非條件為假,在這種情況下它運行第二個,然后是第一個。

然而,在 java 中,這不是局部可變變量、檢查異常和控制流透明,這些都是我不確定這是個好主意的足夠缺點。 特別是考慮到顯然執行順序很重要,這通常表明狀態發生變化。 但是,如果你堅持,它會是這樣的:

public static void runSequentially(Runnable a, Runnable b, boolean flipOrder) {
    if (flipOrder) { b.run(); a.run(); }
    else { a.run(); b.run(); }
}

Javascript 更加自由放任(和完全不同的語言;你標記它是因為你可能不知道 'java' 和 'javascript' 完全無關?這是一個常見的錯誤 - 在這種情況下,忽略這一點),並且不會受到透明度問題的影響。 Javascript 沒有檢查異常,javascript 允許您改變外部狀態(javascript-the-language 中有一些關於此的 WTF,但這是一個單獨的問題)。 最大的問題是控制流(你不能輕易地從這些閉包中中斷/繼續“外部”代碼中的循環)。

暫時回到 java,在以下上下文中使用 lambdas(閉包):

  • lambda 是“內嵌”運行的,也就是說,您將 lambda 傳遞給某個方法,一旦該方法返回,該 lambda 就會被所述方法“遺忘”:該方法沒有將 lambda 存儲在字段中,沒有將它傳遞給另一個線程,沒有將它傳遞給將它存儲在一個字段中或將它傳遞給另一個線程的其他代碼)。
  • lambda 中的代碼不是設計成“功能風格”的(例如它改變狀態或執行一堆 I/O),然后

你可能搞砸了。 Lambda 在那種環境中真的很糟糕,那些透明度問題當時令人惱火。 請注意,如果 lambda 確實“旅行”(存儲/移動到另一個線程),那么缺乏透明度實際上是一件好事,因為這 3 個“透明度”變成了奇怪的腦筋急轉彎 - 最好不要允許它們。

這就是為什么我建議不要這樣做,如果您正在編寫 java.lang. 但現在你知道一個人會怎么做。

感謝所有的建議,我應該更清楚語言,因為我認為這是一個相當簡單的解決方案,可以在 Java 和 Javascript 中工作。 我最終只是將“隨機代碼”放在一個輔助函數中。

function helper() {
    //random code
}

if(number !== 250){
    helper()
    // same code
} else {
    // same code
    helper()
}

基本上這個想法是,執行哪個代碼塊的順序取決於固定變量。 由於代碼重復,沒有輔助函數會很混亂,所以這個簡單的解決方案修復了它。 如果你們想出更聰明的方法,請告訴我! 謝謝

也許你可以使用 else if 語句

if(condition1){
    //method();
} else if(condition2){
    //method();
} else //whathever you want here

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM