精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

擺脫 if-else 束縛的清潔編碼之旅:這些技術幫你實現

開發 前端
面條代碼往往出現在無腦的“粗暴、快速、猛烈”風格的開發中。許多 bug 修復是通過粗暴地在這里添加一個 if 并在多處返回語句來完成的,再加上缺乏注釋,這很容易導致代碼可讀性降低和復雜性增加。

許多學生在維護舊項目時遇到過復雜的業務邏輯嵌套在深層的if-else語句中。面對這樣的亂象,簡單地增量修改通常只會增加復雜性和降低可讀性。那么,有沒有固定的套路可以整理這些代碼呢?這里分享三種簡單而常見的重構方法。

什么是意大利面條代碼?

所謂“意大利面條代碼”在處理復雜業務過程時很常見。它通常具有以下特點:

  • 內容冗長
  • 結構混亂
  • 嵌套深

我們知道,主流編程語言都有函數或方法來組織代碼。對于意大利面條代碼,我們可以將其視為滿足這些特點的函數。根據語言語義的不同,可以將其分為兩種基本類型:

if…if 類型

這種代碼結構看起來像這樣:

function demo(a, b, c) {
  if (f(a, b, c)) {
    if (g(a, b, c)) {
      // ...
    }
    // ...
    if (h(a, b, c)) {
      // ...
    }
  }

  if (j(a, b, c)) {
    // ...
  }

  if (k(a, b, c)) {
    // ...
  }
}

其流程圖如下:

圖片圖片

通過自上而下嵌套 if 語句,單個函數內的控制流不斷增長。不要以為控制流增長時,復雜性只是線性增加。我們知道,函數處理數據,每個 if 內通常都有數據處理邏輯。所以即使沒有嵌套,如果有 3 個這樣的 if 段,那么根據每個 if 是否執行,會有 2 ^ 3 = 8 種可能的數據狀態。如果有 6 段,則會有 2 ^ 6 = 64 種狀態。因此,隨著項目規模的擴大,調試函數變得指數級困難!在數量級上,這與《人月神話》中分享的經驗一致。

else if…else if 類型

這種代碼控制流也很常見,看起來像這樣:

function demo(a, b, c) {
  if (f(a, b, c)) {
    if (g(a, b, c)) {
      // ...
    } else if (h(a, b, c)) {
      // ...
    }
    // ...
  } else if (j(a, b, c)) {
    // ...
  } else if (k(a, b, c)) {
    // ...
  }
}

其流程圖如下:

圖片圖片

else if 最終只會進入其中一個分支,因此不會像前面提到的那樣出現組合爆炸。然而,在深層嵌套中,復雜性依然很高。假設每層嵌套有 3 個 else if 語句,有 3 層嵌套,則會有 3 ^ 3 = 27 種可能的出口。如果每個出口對應一種處理數據的方式,那么在一個函數內封裝這么多邏輯違背了單一職責原則。而且,這兩種類型可以無縫結合,進一步增加復雜性和降低可讀性。

但為什么在框架和庫如此先進的時代,我們仍然經常遇到這樣的代碼?在我看來,可復用的模塊確實幫助我們減少了模板代碼;然而,不管業務邏輯封裝得多好,開發者仍需要編寫它。即使是簡單的 if-else 語句,也能成倍增加控制流的復雜性。從這個角度看,如果沒有基本的編程技巧,不管多快掌握優秀的框架和庫,你可能仍然會寫出混亂的項目。

重構策略

在上文中,我們討論了兩種面條代碼,并定量展示了它們如何成倍增加控制流的復雜性。然而,在現代編程語言中,這種復雜性實際上是完全可控的。以下是列舉的幾種編程技巧來改善面條代碼的場景。

圖片圖片

基本情況

對于 if…if 類型的面條代碼,可以通過基本函數拆分來解決復雜性增長的問題。下圖中每個綠色框代表一個拆分出的新函數:

由于現代編程語言中放棄了 goto,無論控制流多復雜,函數體內代碼的執行順序總是自上而下的。因此,我們完全可以從上到下逐步將單體大函數拆分為多個小函數而不改變控制流邏輯,然后一個個調用它們。這是經驗豐富的同事常用的技巧,具體代碼實現這里不再詳細闡述。

需要注意的是,這種方法中所謂的不改變控制流邏輯是指不需要改變業務邏輯執行的方式,只是將代碼移出去并包裹一層函數。有些同學可能認為這種方法只是治標不治本——它只是將一段長面條切成幾段短面條,沒有本質區別。

但真的是這樣嗎?通過這種方法,我們可以將具有 64 種狀態的大函數拆分為 6 個只返回 2 種狀態的小函數,以及一個逐一調用它們的主函數。這樣,每個函數的復雜性增長率從指數級降低為線性。

通過這種方式,我們解決了 if…if 類型的面條代碼;那么else if…else if類型的呢?

查找表

對于 “else if…else if” 類型的面條代碼,一種最簡單的重構策略是使用所謂的查找表。它以鍵值對的形式封裝每個 else if 中的邏輯:

const rules = {
  x: function (a, b, c) { /* ... */ },
  y: function (a, b, c) { /* ... */ },
  z: function (a, b, c) { /* ... */ }
};

function demo(a, b, c) {
  const action = determineAction(a, b, c);
  return rules[action](a, b, c);
}

每個 else if 中的邏輯被重寫為一個獨立的函數,然后我們可以按以下方式拆分過程:

圖片圖片

對于本身支持反射的腳本語言來說,這是一個相對簡單的技巧。然而,對于更復雜的 else if 條件,這種方法會將控制流復雜性重新集中到 determineAction 中,確定該走哪個分支。有沒有更好的方法來處理這個問題呢?

責任鏈模式

在上文中,查找表是通過鍵值對實現的。當每個分支是一個簡單判斷時,如 else if (x === ‘foo’),foo 可以作為重構集合的鍵。然而,如果每個 else if 分支包含復雜的條件判斷并且需要特定的執行順序,我們可以使用責任鏈模式來更好地重構這種邏輯。

對于 else if,需要注意每個分支是自上而下判斷的,最終只會執行其中一個。這意味著我們可以通過存儲一個“判斷規則”的數組來實現這種行為。如果一個規則匹配,則執行該規則對應的分支。我們稱這樣的數組為“責任鏈”,其模式下的執行過程如圖所示:

圖片圖片

在代碼實現中,我們可以通過責任鏈數組定義等價于else if的規則。

const rules = [
  {
    match: function (a, b, c) { /* ... */ },
    action: function (a, b, c) { /* ... */ }
  },
  {
    match: function (a, b, c) { /* ... */ },
    action: function (a, b, c) { /* ... */ }
  },
  {
    match: function (a, b, c) { /* ... */ },
    action: function (a, b, c) { /* ... */ }
  }
  // ...
]

rules 中的每項都具有 match 和 action 屬性。此時我們可以將原來的 else if 函數重寫為遍歷責任鏈數組:

function demo (a, b, c) {
  for (let i = 0; i < rules.length; i++) {
    if (rules[i].match(a, b, c)) {
      return rules[i].action(a, b, c)
    }
  }
}

當每個責任被匹配時,原函數將直接返回,這也完全符合 else if 的語義。這樣,我們實現了將復雜的 else if 邏輯拆分為單獨的部分。

結尾

面條代碼往往出現在無腦的“粗暴、快速、猛烈”風格的開發中。許多 bug 修復是通過粗暴地在這里添加一個 if 并在多處返回語句來完成的,再加上缺乏注釋,這很容易導致代碼可讀性降低和復雜性增加。

然而,解決這個問題其實并不復雜。這些示例之所以簡單,基本上是因為強大的高級編程

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2023-06-02 07:30:24

If-else結構流程控制

2012-12-07 13:22:49

辦公打印

2013-03-06 10:28:57

ifJava

2010-11-08 14:01:05

私有云

2021-04-13 06:39:13

代碼重構code

2021-03-10 07:20:43

if-else靜態代碼

2021-11-04 08:53:00

if-else代碼Java

2025-08-29 00:00:00

2013-09-24 14:43:55

Windows Sky云存儲

2020-10-22 09:20:22

SQLNoSQL 數據庫

2022-07-11 08:16:55

策略模式if-else

2020-04-09 08:29:50

編程語言事件驅動

2025-10-27 01:33:00

if-else代碼重構

2020-05-13 14:15:25

if-else代碼前端

2020-12-15 09:31:58

CTOif-else代碼

2025-04-24 08:40:00

JavaScript代碼return語句

2025-07-29 09:01:35

if-else代碼

2014-04-24 10:37:25

動態管理云計算

2010-08-11 09:37:33

無線路由故障

2010-04-02 16:05:55

無線路由器
點贊
收藏

51CTO技術棧公眾號

97人人澡人人爽| 日韩成人性视频| 午夜精品久久久久久| 国产精品久久久久久搜索| 一区二区不卡免费视频| 五月天av在线| 水野朝阳av一区二区三区| 日韩精品视频在线观看免费| 超碰网在线观看| 午夜精品一区| 亚洲二区精品| 一区二区三区天堂av| 国产又黄又大又粗视频| 在线观看免费黄视频| 成人污污视频在线观看| 国产精品视频yy9099| 黄色一级视频在线观看| 成人3d动漫在线观看| 亚洲精品在线观看网站| wwwjizzjizzcom| 欧美日韩视频精品二区| 国产美女在线观看一区| 自拍视频国产精品| 日韩av手机在线播放| 男人天堂亚洲天堂| 国产精品私房写真福利视频| 国产乱码精品一区二区三区不卡| 在线观看中文字幕网站| av不卡在线| 日韩电影中文 亚洲精品乱码| 亚洲一区二区三区观看| 伊人久久国产| 久久精品欧美日韩| 成人免费视频视频在| 亚洲中文字幕在线一区| 免费看亚洲片| 国产69精品99久久久久久宅男| 网爆门在线观看| 精品中文在线| 欧美日韩免费一区二区三区| 99蜜桃臀久久久欧美精品网站| 免费在线看电影| 亚洲日本在线视频观看| 色播亚洲婷婷| 国产主播福利在线| 26uuu亚洲| 久久www免费人成精品| 在线观看日本视频| 亚洲免费高清| 孩xxxx性bbbb欧美| 国产在线拍揄自揄拍无码视频| 国产精品videosex性欧美| 国产亚洲精品美女| 国产aⅴ激情无码久久久无码| 久久91在线| 亚洲成年人在线播放| 91精品人妻一区二区三区四区| 国产一区一区| 日韩欧美综合在线| 性一交一黄一片| 美女在线视频免费| 亚洲成人精品在线观看| 国产妇女馒头高清泬20p多| 久久久123| 亚洲成av人片在线观看无码| 欧美视频在线播放一区| jizz在线观看视频| 国产精品沙发午睡系列990531| 日韩免费中文专区| 香蕉视频在线播放| 亚洲欧美另类图片小说| 日韩一级特黄毛片| 2021天堂中文幕一二区在线观| 天天做天天摸天天爽国产一区| 日韩电影天堂视频一区二区| 国产三级视频在线看| 中日韩av电影| 日韩精品久久一区二区| 黄色成人在线网| 香蕉成人啪国产精品视频综合网| 5月婷婷6月丁香| 成人va天堂| 欧美精品久久久久久久多人混战| 国产999免费视频| 国产成人一二| 欧美午夜宅男影院| 亚洲欧美日韩三级| 一区二区三区在线免费看| 亚洲精品第一页| 先锋影音av在线| 欧美一区免费| 日韩av电影在线播放| 亚洲天堂手机版| 粉嫩aⅴ一区二区三区四区| 精品乱码一区二区三区| 99se视频在线观看| 亚洲成在人线免费| 国产免费999| 136导航精品福利| 亚洲欧洲日产国产网站| 日本青青草视频| 久久久亚洲人| 91久久国产自产拍夜夜嗨| 亚洲av电影一区| 亚洲色图视频网站| 国产精品免费观看久久| 日韩欧美激情电影| 在线播放国产精品| www.日本精品| 国产精品一级片| 91免费欧美精品| 香蕉久久一区二区三区| 综合久久综合久久| 91免费视频网站在线观看| 美女视频一区| 日韩精品在线视频美女| 全网免费在线播放视频入口| 欧美日韩在线二区| 久久久久久免费精品| 伊人影院中文字幕| 免费视频最近日韩| 国产日韩一区二区三区| 日韩av中文| 欧美日韩中国免费专区在线看| 永久免费黄色片| 欧美日韩国产高清电影| 91成人在线播放| 精品人妻无码一区二区三区蜜桃一| 国产人久久人人人人爽| 大肉大捧一进一出好爽视频| 91成人短视频| 久久色精品视频| 亚洲图片小说视频| 久久久久久久久久久黄色| 日韩欧美一区二| 在线日韩成人| 久久久久久有精品国产| 精品久久国产视频| 亚洲图片激情小说| 日韩在线不卡一区| 欧美精品尤物在线观看| 国产成人精品久久二区二区| 毛片网站在线观看| 色综合久久中文综合久久牛| 18禁裸乳无遮挡啪啪无码免费| 亚洲国产99| 国产美女在线精品免费观看| 在线电影福利片| 欧美一级生活片| 亚洲精品国产成人av在线| 欧美.日韩.国产.一区.二区| 91免费在线视频| aaa大片在线观看| 欧美一区二区久久| 男女羞羞免费视频| 国产·精品毛片| 久久国产午夜精品理论片最新版本| 日韩欧美高清一区二区三区| 欧美黄色片视频| 人妻精品一区二区三区| 性欧美大战久久久久久久久| 免费成人蒂法网站| 久久精品首页| 亚洲 日韩 国产第一区| 亚洲欧洲专区| 欧美黄色三级网站| 外国精品视频在线观看 | 天天做天天爱天天高潮| 亚洲欧洲二区| 国产做受高潮69| 日本aaa在线观看| 欧美色图天堂网| 日本中文在线视频| 成人一区在线看| 国产精品视频一区二区三区四区五区| 激情婷婷综合| 91中文字幕一区| free性护士videos欧美| 日韩精品视频免费专区在线播放| 一级特黄免费视频| 亚洲免费观看高清完整版在线| 国产污在线观看| 久久午夜精品| 水蜜桃在线免费观看| 美女视频免费精品| 91精品国产自产在线老师啪| www成人免费观看| 一区二区欧美在线| 亚洲精品一区二区口爆| 色999日韩国产欧美一区二区| 国内自拍偷拍视频| 免费亚洲一区| 中文字幕一区二区三区四区五区人 | 亚洲AV成人无码一二三区在线| 欧美性感一类影片在线播放| 国产福利久久久| 中文字幕av不卡| 插我舔内射18免费视频| 麻豆精品视频在线观看免费 | 日本黄色录像视频| 久久久久欧美精品| 国产911在线观看| 精品午夜久久| 国产亚洲欧美一区二区三区| 久久精品xxxxx| 国产91精品视频在线观看| 日本高清视频在线播放| 亚洲精品av在线播放| 国产精品爽爽久久| 色婷婷久久久综合中文字幕| 久久免费黄色网址| 国产精品国产三级国产专播品爱网 | 久久精品国产亚洲av香蕉| 国产三区在线成人av| 性高潮免费视频| 久久99国产精品久久99果冻传媒| 青青视频在线播放| 激情欧美一区| 妺妺窝人体色www看人体| 久久中文字幕二区| 日韩成人av网站| 亚洲第一福利社区| 国产精品久久久久久久小唯西川| 日韩色性视频| 国产精品久久久久久久一区探花| 美女网站在线看| 久久人人爽国产| 欧美人体视频xxxxx| 精品国产一区二区三区久久狼黑人| 蜜桃免费在线| 日韩精品黄色网| 欧美一区二区公司| 精品国产网站在线观看| 亚洲国产精品国自产拍久久| 欧美精品777| 91丨九色丨丰满| 欧美日韩高清一区二区| 97人妻精品视频一区| 日韩欧亚中文在线| 色一情一乱一伦| 欧美日韩在线免费观看| 狠狠躁夜夜躁人人爽天天高潮| 一二三区精品福利视频| 欧美日韩在线观看成人| 亚洲欧美视频一区| av激情在线观看| 亚洲精品久久嫩草网站秘色| avove在线播放| 一区二区三区精品| 免费毛片一区二区三区| 亚洲成av人**亚洲成av**| 日韩精品乱码久久久久久| 午夜天堂影视香蕉久久| 黄色在线免费观看| 色婷婷亚洲综合| 日本丰满少妇做爰爽爽| 欧美色图12p| 国产a级免费视频| 午夜精品久久久久久久99水蜜桃 | 亚洲午夜伦理| www.av蜜桃| 国产精品美女久久久浪潮软件| 亚洲成色www久久网站| 日韩黄色大片网站| 国内视频一区| 亚洲综合小说图片| 日韩欧美视频一区二区三区四区| 日韩精品一卡| a级网站在线观看| 亚洲激情午夜| 欧美三级午夜理伦三级| 久久99精品久久久久久久久久久久| 男人午夜视频在线观看| 成人小视频免费观看| 亚洲精品女人久久久| 久久综合成人精品亚洲另类欧美| 阿v天堂2014| 亚洲乱码中文字幕| 圆产精品久久久久久久久久久| 色婷婷av一区二区三区之一色屋| 91丨九色丨丰满| 亚洲精品国产suv| 成人高清免费观看mv| 插插插亚洲综合网| 国产自产自拍视频在线观看| 国产精品久在线观看| 日韩中文字幕在线一区| 奇米888一区二区三区| 这里只有精品在线| 看av免费毛片手机播放| 久久99精品国产麻豆不卡| 国产一卡二卡三卡四卡| 欧美国产精品中文字幕| 精品一级少妇久久久久久久| 在线亚洲免费视频| 亚洲女人18毛片水真多| 国产午夜一区二区| 国产美女一区视频| 国产精品视频一区国模私拍 | 天天好比中文综合网| 欧美视频不卡| 911福利视频| 91麻豆视频网站| 国产亚洲小视频| 欧美精品欧美精品系列| 日本福利片在线| 久久久久久久91| 中文成人在线| 日韩欧美99| 久久高清免费观看| 精品影片一区二区入口| 亚洲欧美国产77777| 久久这里只有精品9| 亚洲国语精品自产拍在线观看| 黄页视频在线播放| 国产精品v日韩精品| 国产精品香蕉| 老司机午夜免费福利视频| 蜜芽一区二区三区| av女人的天堂| 日韩欧美在线视频观看| 欧美视频一二区| 欧美日韩福利在线观看| 亚洲精品aaa| 亚洲午夜精品一区二区| 视频一区在线视频| 波多野结衣福利| 欧美日韩亚洲精品一区二区三区| 女人18毛片水真多18精品| 色在人av网站天堂精品| 99re8精品视频在线观看| 亚洲最新在线| 麻豆91精品视频| 国精产品一区一区| 欧美三级三级三级爽爽爽| 九九九伊在人线综合| 欧美在线视频导航| 依依综合在线| 九九久久99| 亚洲欧美不卡| 黑人巨大精品欧美| 色综合中文字幕国产| 欧美18xxxxx| 成人毛片在线观看| 欧美三级理论片| 国产女人18毛片水真多成人如厕 | 欧美日韩中文另类| 国产黄在线观看| 国产精品美乳在线观看| 日韩精品2区| 99热一区二区| 综合久久给合久久狠狠狠97色| 国产精品嫩草影院桃色| 久久亚洲精品中文字幕冲田杏梨 | 精品一区在线播放| 国产乱码精品| 一区二区三区伦理片| 欧美三区免费完整视频在线观看| 在线视频婷婷| 91视频在线免费观看| 亚洲国产一区二区三区a毛片| 91黄色免费视频| 在线中文字幕不卡| 黄色片免费在线观看| 成人自拍偷拍| 亚洲一区亚洲| xxxxx99| 欧美一区二区三区性视频| 成人爽a毛片免费啪啪动漫| 久久草.com| 久久国产欧美日韩精品| 久久久99精品| 亚洲美女中文字幕| 一区二区三区无毛| 福利视频一区二区三区四区| 久久久久久久久蜜桃| 国产一区二区在线不卡| 欧美激情精品久久久久久大尺度| 亚州综合一区| 911福利视频| 欧美日韩一区免费| а√天堂在线官网| 精品久久久久亚洲| 久久超碰97人人做人人爱| 国产精品第二十页| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 成年无码av片在线| 日韩在线黄色| 91 视频免费观看| 欧美性xxxxxx| 激情影院在线观看| 欧洲精品久久| 国产精品一级在线| 自拍偷拍色综合| 欧美精品videos性欧美| 成人激情电影在线| 成人在线视频免费播放| 制服丝袜亚洲色图| 影视一区二区三区| 欧美成人三级在线视频|