摘要:一為什么要消除當寫下第一行時就為發(fā)展成幾十個埋下了伏筆當一個有可能臃腫時那么它一定會臃腫墨菲一個例子看起來非常美妙簡潔但是當系統(tǒng)慢慢復(fù)雜化角色不斷的豐富就變成這樣的代碼來個極端的例子可以說非??膳铝硕绾蜗@種條件里都是
一. 為什么要消除 if-else
當寫下第一行 if-else 時,就為發(fā)展成幾十個 if-else 埋下了伏筆.
當一個 if-else 有可能臃腫時,那么它一定會臃腫. --墨菲
一個例子:
$userType = ""; if ($userTypeID == 1){ $userType = "Admin"; }elseif($userTypeID == 2){ $userType = "Corporate Customers"; }
看起來非常美妙,簡潔.但是當系統(tǒng)慢慢復(fù)雜化,角色不斷的豐富,就變成這樣的代碼:
$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 我們可以采用 查表法 來消除.
通過容器將對應(yīng)的關(guān)系進行存儲。通過運算得出相應(yīng)關(guān)系中的其中一方的結(jié)果,再通過這個結(jié)果去容器中找對應(yīng)的另一個內(nèi)容
通俗的說,就是建立一個對象或者數(shù)組的 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. 考慮更復(fù)雜的情況,當不同的 userTypeID 時進行不同邏輯處理.
if (userTypeID == 1) { //Todo ... } else if(userTypeID == 2) { //Todo ... } else if(userTypeID == 3) { //Todo ... } else if(userTypeID == 4) { //Todo ... }
這個時候可以把里面的邏輯處理代碼抽出來為一個函數(shù):
let userTypeObj = { 1: () => { //Todo... }, 2: () => { //Todo... }, 3: () => { //Todo... }, 4: () => { //Todo... }, }; userTypeObj[userTypeID]();
以上代碼也可以以 php 的可變變量/面向?qū)ο蟮亩鄳B(tài)特性來實現(xiàn).
缺點:查表法的實現(xiàn),要做越界檢查,還要確保下標計算不會重復(fù),如果使用面向?qū)ο蟮亩鄳B(tài)特性來實現(xiàn),也有策略類增多等問題.
這個查表法的實現(xiàn),其實是策略模式的思想.
策略模式指的是定義一系列的算法,把他們一個個的封裝起來.策略模式的目的就是將算法的使用與算法的實現(xiàn)分離開來.
更多關(guān)于策略模式的講解,請看這里
三. 總結(jié)if-else 當然是有用的,比如 mysql 鏈接, curl 的返回碼等等.當開始寫的時候,只有一個 if-else ,我們可以不去消除,但是當要寫到第三個第四個分支,或者每個條件分支里面都有大段大段的邏輯處理代碼,我們就要考慮消除它了.
當條件語句不是定值,而是范圍值的時候,如何消除 if-else 求教:
if(x < 30){ //todo }else if(x >= 30 ){ //todo }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/29648.html
摘要:一為什么要消除當寫下第一行時就為發(fā)展成幾十個埋下了伏筆當一個有可能臃腫時那么它一定會臃腫墨菲一個例子看起來非常美妙簡潔但是當系統(tǒng)慢慢復(fù)雜化角色不斷的豐富就變成這樣的代碼來個極端的例子可以說非常可怕了二如何消除消除這種條件里都是 一. 為什么要消除 if-else 當寫下第一行 if-else 時,就為發(fā)展成幾十個 if-else 埋下了伏筆. 當一個 if-else 有可能臃腫時,那么...
摘要:寫好的單元測試,對開發(fā)速度項目維護有莫大的幫助。我認為單元測試的上下文存在于敏捷中。接下來一小節(jié),就可以正式進入如何做的環(huán)節(jié)了如何寫好單元測試。前面說到,我們對單元測試寄予 寫好的單元測試,對開發(fā)速度、項目維護有莫大的幫助。前端的測試工具一直推陳出新,而測試的核心、原則卻少有變化。與產(chǎn)品代碼一并交付可靠的測試代碼,是每個專業(yè)開發(fā)者應(yīng)該不斷靠近的一個理想之地。本文就圍繞測試講講,為什么我...
摘要:二叉樹二叉樹是一種樹形結(jié)構(gòu),它的特點是每個節(jié)點最多只有兩個分支節(jié)點,一棵二叉樹通常由根節(jié)點,分支節(jié)點,葉子節(jié)點組成。 二叉樹 二叉樹(Binary Tree)是一種樹形結(jié)構(gòu),它的特點是每個節(jié)點最多只有兩個分支節(jié)點,一棵二叉樹通常由根節(jié)點,分支節(jié)點,葉子節(jié)點組成。而每個分支節(jié)點也常常被稱作為一棵子樹。 showImg(https://segmentfault.com/img/bVbmEd...
摘要:為何重構(gòu)重構(gòu)有四大好處重構(gòu)改進軟件設(shè)計如果沒有重構(gòu),程序的設(shè)計會逐漸腐敗變質(zhì)。經(jīng)常性的重構(gòu)可以幫助維持自己該有的形態(tài)。你有一個大型函數(shù),其中對局部變量的使用使你無法采用。將這個函數(shù)放進一個單獨對象中,如此一來局部變量就成了對象內(nèi)的字段。 哪有什么天生如此,只是我們天天堅持。 -Zhiyuan 國慶抽出時間來閱讀這本從師傅那里借來的書,聽說還是程序員的必讀書籍。 關(guān)于書的高清下載連...
閱讀 1827·2021-09-22 15:54
閱讀 2938·2021-09-01 10:42
閱讀 3451·2019-08-30 15:56
閱讀 1445·2019-08-29 18:46
閱讀 2476·2019-08-29 10:57
閱讀 2719·2019-08-28 17:57
閱讀 3670·2019-08-23 18:14
閱讀 842·2019-08-23 17:03