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