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,既...