程式中減少使用 if 語句的策略

2021-07-14 17:28:34 字數 2014 閱讀 9198

if語句會觸發以下問題:

if 條件1

處理語句1

elseif 條件2

處理語句2

else

處理語句3

1)if 語句的**易越改越混亂。「處理語句」越來越多,耦合越來越複雜,就會很難讀。進一步巢狀 if 語句與本地 return 的濫用情況也很常見,很難搞懂業務邏輯是選擇了哪種路徑。

2)if 語句缺失 domain 的概念,很容易在不需要的情況下,將內容放在一起而增加耦合性,造成**難讀難改。

3)開發者必須在頭腦中模擬執行實現情況。開發者的精力應當用來思考如何解決問題,而不是浪費在如何將複雜的**分支結構編織在一起之上。

策略1:布林引數(boolean params)

背景: 在方法中依據 boolean值選擇合適的處理策略。

void 函式名(引數1,引數2, boolean temporary) 

else

}

問題:上述****中是將兩個方法**到一起,布林引數作用在**中定義乙個概念。在編譯時可以算出**要採用哪種策略,就可以放心使用這種模式。

解決方案: 將這個方法拆分成兩個新的方法,然後即可消除 if 。

策略2:使用多型(polymorphism)

背景: 使用switch時 依據型別選擇策略。

switch (type) 

問題: 在新增新的型別時,必須要記得更新 switch 語句。根據型別做單次切換是可行的,如果 switch 太多,在新增新型別時如果忘記更新現有隱藏型別中的所有 switch,就會導致 bug 出現。

解決方案: 使用多型,新增新型別時新增相關行為。

class 基類 

protected 函式2()

protected 函式3()

}class 子類1 :繼承方式 基類

}class 子類2:繼承方式 基類

}

策略3:nullobject/optional

背景: 當外部請求時,回答「查一下 null 的情況」。

int 方法名(引數)

return 處理;

}

策略4:將內聯語句(inline statements)轉為表示式

boolean horrible(boolean foo, boolean bar, boolean baz) 

}if (baz)

else

}

問題: 這種**會導致開發者必須用大腦來模擬計算機對方法的處理。很少有不適用的情況,像這樣的**可以合成一行,或者拆成不同的部分。

解決方案: 將 if 語句樹合成單個表示式。

boolean horrible(boolean foo, boolean bar, boolean baz)

策略5:給出應對策略

背景:在呼叫一些其他**時,無法確保處理是否成功。

class repository 

}class finder

else

}}

問題: 這類 if 語句增加了處理同乙個物件或者資料結構的時間,其中包含隱藏耦合——null 的情況。其它物件可能會返回其他代表沒有結果的 magic value。最好將這類 if 語句放在乙個地方,由於不會重複,就能將為空物件的 magic value 刪除。

解決方案:針對被呼叫**,給出應對策略。

class repository 

return defaultvalue;

}} public

class finder

}

調優(二) 減少if語句的使用

程式中減少if語句的使用 注 if語句通常會讓 更加負載,但這不代表要完全拋棄if語句 1 if語句的問題 a.通常出現if語句的 很容易越改越糟 b.複製時會有問題,即if語句缺失domain的概念 c.開發者必須在頭腦中模擬執行實際情況,造成腦細胞浪費 2 替代if語句的方案 1 布林引數 bo...

減少平均時延的策略

為了提高服務的高可用性,減少時延帶來的詬病,採取減少平均時延策略,可用方式有哪些?如何將此策略與現在流行的微服務框架結合,給出你熟悉微服 務框架的融合的設計方案。服務呼叫 通訊 可以分為以下幾個層級 在設計微服務呼叫時,盡量使用上面層級的,而不是下面層級的 可以進 程內呼叫的,不要跨程序 可以主機內...

程式設計師如何減少開發中的 Bug?

一 概述 愛因斯坦曾經說過 如果給我乙個小時解答一道決定我生死的問題,我會花55分鐘來弄清楚這道題到底是在問什麼。一旦清楚了它在問什麼,剩下的5分鐘足夠解答這個問題。雖然我們軟體開發過程不會面臨生死的抉擇,但是卻直接影響著使用者的使用感受,決定著產品的走向。所以程式設計師如何減少開發中的 bug,既...