成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

代碼重構(gòu)之消除分支結(jié)構(gòu)

littlelightss / 748人閱讀

摘要:一為什么要消除當(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

相關(guān)文章

  • 代碼重構(gòu)消除分支結(jié)構(gòu)

    摘要:一為什么要消除當(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í),那么...

    Markxu 評(píng)論0 收藏0
  • React 單元測(cè)試策略及落地

    摘要:寫(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è)試講講,為什么我...

    nifhlheimr 評(píng)論0 收藏0
  • js數(shù)據(jù)結(jié)構(gòu)-二叉樹(shù)(二叉堆)

    摘要:二叉樹(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...

    ningwang 評(píng)論0 收藏0
  • 重構(gòu)---改善既有代碼的設(shè)計(jì)》

    摘要:為何重構(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ū)的高清下載連...

    baihe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<