[英]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 確實“旅行”(存儲/移動到另一個線程),那么缺乏透明度實際上是一件好事,因為這 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.