摘要:一為什么要消除當寫下第一行時就為發展成幾十個埋下了伏筆當一個有可能臃腫時那么它一定會臃腫墨菲一個例子看起來非常美妙簡潔但是當系統慢慢復雜化角色不斷的豐富就變成這樣的代碼來個極端的例子可以說非常可怕了二如何消除消除這種條件里都是
一. 為什么要消除 if-else
當寫下第一行 if-else 時,就為發展成幾十個 if-else 埋下了伏筆.
當一個 if-else 有可能臃腫時,那么它一定會臃腫. --墨菲
一個例子:
$userType = ""; if ($userTypeID == 1){ $userType = "Admin"; }elseif($userTypeID == 2){ $userType = "Corporate Customers"; }
看起來非常美妙,簡潔.但是當系統慢慢復雜化,角色不斷的豐富,就變成這樣的代碼:
$userType = ""; if ($userTypeID == 1){ $userType = "Admin"; }elseif($userTypeID == 2){ $userType = "Corporate Customers"; }elseif($userTypeID == 3){ $userType = "Editorial Users"; }elseif($userTypeID == 4){ $userType = "Photographers"; }elseif($userTypeID == 5){ $userType = "Vendors"; }
來個極端的例子:
可以說非常可怕了.
二. 如何消除 if-else消除這種條件里都是定值的 if-else 我們可以采用 查表法 來消除.
通過容器將對應的關系進行存儲。通過運算得出相應關系中的其中一方的結果,再通過這個結果去容器中找對應的另一個內容
通俗的說,就是建立一個對象或者數組的 hash 表, key 值存儲條件判斷, value 存儲符合該條件判斷的邏輯處理.
比如上面的代碼可以寫成:
const USER_TYPE_ADMIN = 1; const USER_TYPE_CORPORATE = 2; const USER_TYPE_EDITORIAL = 3; const USER_TYPE_PHOTOGRAPHERS = 4; const USER_TYPE_VENDORS = 5; public function getUserTypeName($key = null){ $data = array( self::USER_TYPE_ADMIN => "Admin", self::USER_TYPE_CORPORATE => "Corporate Customers", self::USER_TYPE_EDITORIAL => "Editorial Users", self::USER_TYPE_PHOTOGRAPHERS => "Photographers", self::USER_TYPE_VENDORS => "Vendors", ); return $key === null ? $data : (isset($data[$key]) ? $data[$key] : ""); }
這樣,上面的一大段的 if-else 就一行代碼搞定: $userType = User::getUserTypeName($userTypeID)
用 JavaScrip 語言來描述:
let userTypeObj = { 1: "Admin", 2: "Corporate Customers", 3: "Editorial Users", 4: "Photographers", 5: "Vendors", }; let userTypeName = userTypeObj[userTypeID];
上面的例子只是不同的 userTypeID 獲取不同的 userTypeName. 考慮更復雜的情況,當不同的 userTypeID 時進行不同邏輯處理.
if (userTypeID == 1) { //Todo ... } else if(userTypeID == 2) { //Todo ... } else if(userTypeID == 3) { //Todo ... } else if(userTypeID == 4) { //Todo ... }
這個時候可以把里面的邏輯處理代碼抽出來為一個函數:
let userTypeObj = { 1: () => { //Todo... }, 2: () => { //Todo... }, 3: () => { //Todo... }, 4: () => { //Todo... }, }; userTypeObj[userTypeID]();
以上代碼也可以以 php 的可變變量/面向對象的多態特性來實現.
缺點:查表法的實現,要做越界檢查,還要確保下標計算不會重復,如果使用面向對象的多態特性來實現,也有策略類增多等問題.
這個查表法的實現,其實是策略模式的思想.
策略模式指的是定義一系列的算法,把他們一個個的封裝起來.策略模式的目的就是將算法的使用與算法的實現分離開來.
更多關于策略模式的講解,請看這里
三. 總結if-else 當然是有用的,比如 mysql 鏈接, curl 的返回碼等等.當開始寫的時候,只有一個 if-else ,我們可以不去消除,但是當要寫到第三個第四個分支,或者每個條件分支里面都有大段大段的邏輯處理代碼,我們就要考慮消除它了.
當條件語句不是定值,而是范圍值的時候,如何消除 if-else 求教:
if(x < 30){ //todo }else if(x >= 30 ){ //todo }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/108720.html
摘要:一為什么要消除當寫下第一行時就為發展成幾十個埋下了伏筆當一個有可能臃腫時那么它一定會臃腫墨菲一個例子看起來非常美妙簡潔但是當系統慢慢復雜化角色不斷的豐富就變成這樣的代碼來個極端的例子可以說非常可怕了二如何消除消除這種條件里都是 一. 為什么要消除 if-else 當寫下第一行 if-else 時,就為發展成幾十個 if-else 埋下了伏筆. 當一個 if-else 有可能臃腫時,那么...
摘要:寫好的單元測試,對開發速度項目維護有莫大的幫助。我認為單元測試的上下文存在于敏捷中。接下來一小節,就可以正式進入如何做的環節了如何寫好單元測試。前面說到,我們對單元測試寄予 寫好的單元測試,對開發速度、項目維護有莫大的幫助。前端的測試工具一直推陳出新,而測試的核心、原則卻少有變化。與產品代碼一并交付可靠的測試代碼,是每個專業開發者應該不斷靠近的一個理想之地。本文就圍繞測試講講,為什么我...
摘要:二叉樹二叉樹是一種樹形結構,它的特點是每個節點最多只有兩個分支節點,一棵二叉樹通常由根節點,分支節點,葉子節點組成。 二叉樹 二叉樹(Binary Tree)是一種樹形結構,它的特點是每個節點最多只有兩個分支節點,一棵二叉樹通常由根節點,分支節點,葉子節點組成。而每個分支節點也常常被稱作為一棵子樹。 showImg(https://segmentfault.com/img/bVbmEd...
摘要:為何重構重構有四大好處重構改進軟件設計如果沒有重構,程序的設計會逐漸腐敗變質。經常性的重構可以幫助維持自己該有的形態。你有一個大型函數,其中對局部變量的使用使你無法采用。將這個函數放進一個單獨對象中,如此一來局部變量就成了對象內的字段。 哪有什么天生如此,只是我們天天堅持。 -Zhiyuan 國慶抽出時間來閱讀這本從師傅那里借來的書,聽說還是程序員的必讀書籍。 關于書的高清下載連...
閱讀 1216·2023-04-25 20:56
閱讀 2255·2023-04-25 14:42
閱讀 1020·2023-04-25 14:06
閱讀 2859·2021-10-14 09:42
閱讀 2135·2021-09-22 16:03
閱讀 978·2021-09-13 10:30
閱讀 1342·2019-08-29 15:41
閱讀 1789·2019-08-29 12:55