[英]clever way to execute code block if any condition in if/else if was true
我經常有 if/else if 塊部分包含相同的代碼。 我只想編寫一次此代碼,類似於“not else”(如果不滿足先驗條件,則執行 else 塊,如果滿足任何先驗條件,則執行 not else 塊)。 我知道您可以在每個塊中設置一個標志並測試之后是否設置了標志,或者創建一個在每個塊中調用的函數(如果您不需要編輯局部變量)。 您有更聰明/更優雅的解決方案的想法嗎? 在校對問題時,我想出了在 else 塊中返回並在其后放置您的通用代碼的想法 - 僅在您之前不必返回時才有效。
if (condition1) {
/* unique code1 */
/* common code */
} else if (condition2) {
/* unique code2 */
/* common code */
} else if (condition3) {
/* unique code3 */
/* common code */
} else if (condition4) {
/* unique code4 */
/* common code */
}
一個非常規的解決方案是迭代一次的循環,從而為您提供break
選項:
do {
if (condition1) {
// ...
} else if (condition2) {
// ...
} else if (condition3) {
// ...
} else break;
// common code
} while (false);
但是為了可讀性,我會選擇您在問題中已經提到的標志選項。
您可以將條件及其各自的代碼存儲在列表中,如下所示:
const conditions = [
[condition1, () => {/* unique code1 */}],
[condition2, () => {/* unique code2 */}],
[condition3, () => {/* unique code3 */}],
[condition4, () => {/* unique code4 */}],
];
const hasTruthy = conditions.some(([condition, fn]) => {
if (condition) {
fn();
return true;
}
});
if (hasTruthy) {
/* common code */
}
但這可能只有在所有條件都很便宜的情況下才是可取的。 如果它們是性能飢渴的,即使只有一些實際上需要檢查,它們也會被執行。 如果條件確實很昂貴,您可以使用函數調用而不是實際條件並在some
循環中調用它們。
100 次中有 99 次,我會采用 caw 在他現已刪除的答案中所建議的。
但是如果你有一組非常長的條件(比如超過 10 個),你可以考慮使用映射(關聯數組)來查找條件的代碼路徑
let action_table = [];
action_table["condition1"] = ()=>{/* unique code 1 */};
action_table["condition2"] = ()=>{/* unique code 2 */};
action_table["condition3"] = ()=>{/* unique code 3 */};
action_table["condition4"] = ()=>{/* unique code 4 */};
let condition = /*compute condition based on variables and state*/;
action_table[condition](); /* execute unique code action */
unique_code();
/* common code */
當每個條件的唯一代碼路徑正在做一些微不足道的事情(例如轉換值、設置解析狀態、處理標記等)並且公共代碼是函數目的的核心所在時,這可能很有用。 通常上面是當原始實現開始有太多 if/else 條件時切換到的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.