精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

668精品在线视频| 日韩美女一区二区三区四区| 日韩高清三级| 国产免费av观看| 亚洲第一在线| 国产亚洲综合久久| 免费高清视频在线观看| 一区二区电影免费观看| 国产精品国产三级国产aⅴ中文 | 精品国产鲁一鲁****| 亚洲国产精品久久久久秋霞影院| 欧美一区三区二区在线观看| 国产伦理一区二区| 天使萌一区二区三区免费观看| 精品国产一区二区三区四区在线观看| 日韩精品人妻中文字幕有码| 欧美成人xxxx| 日韩欧美在线字幕| 日本天堂免费a| 久久久久国产精品嫩草影院| 国产综合久久久久久久久久久久| 欧美在线观看视频| 久久久精品国产sm调教| 久久视频精品| 亚洲三级av在线| 四季av综合网站| 精品精品视频| 欧美乱妇23p| 黄色一级免费大片| 中文在线8资源库| 亚洲一区二区三区影院| 久久免费视频2| av播放在线观看| 久久精品免费在线观看| 国产在线精品一区二区中文| 国产伦精品一区二区三区四区 | 中文字幕66页| 成人免费福利| 欧美日韩在线视频观看| 五十路熟女丰满大屁股| 在线黄色网页| 亚洲三级电影网站| 在线视频精品一区| 蜜桃视频网站在线| 亚洲国产成人在线| 日本一区二区三区精品视频| 色鬼7777久久| 99国产麻豆精品| 国产日韩精品久久| 熟妇人妻中文av无码| 不卡一区二区三区四区| 国产精品国产一区二区| 亚洲第一成年人网站| 国产成人在线视频播放| 91精品综合久久| 99riav国产| 国产成a人亚洲| 成人区精品一区二区| 亚洲av综合色区无码一二三区| 国产在线一区二区| 51国产成人精品午夜福中文下载 | 亚洲欧美国产精品久久久久久久| 日本xxxx裸体xxxx| 国精一区二区| 日韩最新免费不卡| 欧美成人精品激情在线视频| 欧美成人tv| 久久免费国产视频| 99精品人妻国产毛片| 日日夜夜免费精品| 成人美女免费网站视频| 精品国产av一区二区三区| 高清不卡在线观看av| 国产欧美亚洲日本| 你懂的好爽在线观看| 国产日本欧美一区二区| 曰韩不卡视频| 欧美性猛片xxxxx免费中国| 亚洲成av人片一区二区| 北条麻妃视频在线| vam成人资源在线观看| 精品少妇一区二区| 成人乱码一区二区三区av| 91免费精品| 久久久噜噜噜久久中文字免| 国产一区二区视频免费| 国产一区二区三区观看| 国产日韩欧美一区二区| 成人精品一区二区| 亚洲综合区在线| 国产福利视频在线播放| 精品一区二区三区中文字幕在线| 亚洲精品久久久久久久久久久| 欧美 日韩 国产 成人 在线观看| 91成人精品| 欧日韩不卡在线视频| 国产理论视频在线观看| 久久这里只有精品视频网| 自拍偷拍一区二区三区| 涩涩视频在线免费看| 7777精品伊人久久久大香线蕉超级流畅 | 欧美精品丝袜久久久中文字幕| 国产xxx在线观看| 国产精品午夜一区二区三区| 九九精品在线播放| 最近中文在线观看| av中文字幕不卡| 日本一区二区三区四区五区六区| 色综合桃花网| 日韩欧美不卡在线观看视频| 中文字幕免费视频| 亚洲精品国产日韩| 亚洲在线视频福利| 粉嫩av一区| 精品国产户外野外| 国产吃瓜黑料一区二区| 欧美独立站高清久久| 国产999精品久久久| 日本黄色不卡视频| 亚洲免费观看高清完整版在线观看 | 国产精品亚洲第一| 亚洲蜜桃在线| 在线观看精品| 亚洲精品日韩欧美| 日本少妇激情舌吻| 国产69精品久久777的优势| 一本久道久久综合| 成人免费毛片嘿嘿连载视频…| 亚洲国产毛片完整版| 久久久久99精品成人片毛片| 激情文学综合丁香| 亚洲天堂电影网| 日韩av一级| 国产一区二区av| 国产精品suv一区| 91网上在线视频| 九色自拍视频在线观看| 99精品国产一区二区三区2021| 精品国产一区二区三区在线观看 | 日韩一级免费一区| 日本在线一级片| 九九九久久久精品| 一区国产精品| 日韩三级成人| 日韩一区av在线| 国产又粗又猛又爽又黄视频| 中文字幕欧美区| 手机在线成人免费视频| 久久国产小视频| 成人精品一区二区三区电影免费| 97超碰国产一区二区三区| 欧美午夜宅男影院| 精品伦精品一区二区三区视频密桃| 男人的j进女人的j一区| 亚洲精品一区二区三| 久久久久伊人| 精品国产一区二区三区久久久狼| 国产精品丝袜黑色高跟鞋| 一区精品在线播放| 妖精视频在线观看| 亚洲国产91| 久久99精品久久久久久秒播放器| 欧美aa在线| 这里只有精品久久| 97在线公开视频| 亚洲综合色婷婷| 泷泽萝拉在线播放| 蜜桃av噜噜一区二区三区小说| 亚洲精品免费在线看| 欧美精品三级在线| 亚洲18私人小影院| 大地资源中文在线观看免费版| 欧美日韩日日夜夜| 久久精品一级片| 91亚洲精品一区二区乱码| 日本熟妇人妻中出| 中文精品久久| 九色一区二区| 国产精品天堂蜜av在线播放| 精品视频9999| 日韩电影网址| 91麻豆精品国产91久久久使用方法| 久操视频免费在线观看| 91视频.com| 天天干天天色天天干| 精品999成人| 先锋影音亚洲资源| eeuss国产一区二区三区四区| 欧美野外猛男的大粗鳮| 国产淫片在线观看| 亚洲精品一区二三区不卡| 97国产精品久久久| 午夜av一区二区三区| 一级黄色毛毛片| 成人av电影在线播放| 高清一区在线观看| 精品二区视频| 伊人久久婷婷色综合98网| 国产精品白丝av嫩草影院| 国产精品偷伦一区二区| 国产传媒在线| 欧美成人免费观看| 国产二区视频在线观看| 亚洲成人av资源网| 91在线视频国产| 欧美性猛交xxxx免费看久久久| 大地资源高清在线视频观看| xf在线a精品一区二区视频网站| 国产3p在线播放| 久久欧美肥婆一二区| 欧美亚洲黄色片| 亚洲午夜精品一区二区国产| 免费在线成人av| 精品av导航| 91久久精品一区二区别| 久久免费影院| 国产精品久久综合av爱欲tv| 国内精彩免费自拍视频在线观看网址| 视频一区视频二区国产精品| 日本午夜在线视频| 精品久久国产字幕高潮| aaa国产视频| 精品视频在线看| 一级片在线免费播放| 欧美日韩亚洲成人| 日本少妇毛茸茸高潮| 亚洲精品国产无套在线观| 免费黄色国产视频| 中文字幕国产一区| 少妇精品无码一区二区免费视频| 99国产精品久久久久久久久久| www.久久com| 精品亚洲porn| 国产aⅴ爽av久久久久| 日本亚洲最大的色成网站www| 欧美极品欧美精品欧美图片| 亚洲视频二区| 日本中文字幕网址| 亚洲激精日韩激精欧美精品| 男人c女人视频| 国产主播精品| a天堂资源在线观看| 欧美国产综合| 国产精品第157页| 1024日韩| 国产精品丝袜久久久久久消防器材| 中国女人久久久| av黄色在线网站| 六月丁香综合| 午夜免费高清视频| 久久国产成人午夜av影院| 色噜噜狠狠一区二区| 久久精品国产久精国产爱| gai在线观看免费高清| 精品中文字幕一区二区| 日韩精品视频网址| 不卡影院免费观看| 好吊一区二区三区视频| 久久久精品国产免大香伊 | 亚洲视频一二三区| 国产免费无码一区二区视频| 亚洲午夜久久久久久久久久久| 亚洲国产精一区二区三区性色| 亚洲国产aⅴ天堂久久| 黄色大片网站在线观看| 91久久香蕉国产日韩欧美9色| 中文字幕视频二区| 欧美一区二区福利在线| 亚洲精品国产一区二| 亚洲男人的天堂在线| av在线播放av| 欧美精品激情在线| 中文字幕这里只有精品| 国产原创欧美精品| 97se亚洲国产一区二区三区| 欧美日韩高清在线一区| 91综合在线| www..com日韩| 奇米精品一区二区三区四区 | 全黄性性激高免费视频| 视频一区二区欧美| 香蕉视频xxxx| 久久综合色之久久综合| 一级黄色片日本| 亚洲国产成人tv| 精品乱码一区内射人妻无码| 日韩丝袜情趣美女图片| 蜜桃视频在线免费| 欧美成人四级hd版| 欧美第一视频| 国产v亚洲v天堂无码| 欧洲福利电影| xxxx18hd亚洲hd捆绑| 日av在线不卡| 日韩av手机在线播放| 国产精品电影院| 日本va欧美va国产激情| 欧美美女直播网站| 久色视频在线| 91国内在线视频| 成人97精品毛片免费看| 免费在线观看一区二区| 欧美日本中文| 国产三级国产精品国产专区50| 9l国产精品久久久久麻豆| 永久免费看mv网站入口| 欧美体内谢she精2性欧美| www国产在线| 视频在线一区二区| 免费福利视频一区二区三区| 97久久人人超碰caoprom欧美| 成人久久综合| jizzjizz国产精品喷水| 国产高清成人在线| 亚洲天堂网av在线| 欧美在线一二三四区| 天堂av2024| 欧美精品成人91久久久久久久| 色综合久久久| 亚洲精品成人三区| 日韩高清一区在线| 熟女俱乐部一区二区视频在线| 亚洲国产一二三| 亚洲成人第一区| 免费av一区二区| 粉嫩一区二区三区在线观看| 日本精品一区二区三区视频| 亚洲一区二区成人| 少妇一级淫免费观看| 亚洲网友自拍偷拍| 亚洲国产av一区二区| 久久亚洲精品国产亚洲老地址| 日本午夜免费一区二区| 一区二区三区av在线| 麻豆精品在线观看| 丰满的亚洲女人毛茸茸| 在线看国产日韩| av在线播放网| 国产精品极品美女在线观看免费 | 国产精品久久久久久久久免费高清| 日本视频精品一区| 亚洲免费网站| 一级黄色片大全| 91国产免费观看| 国产对白叫床清晰在线播放| 国产福利精品视频| 波多野结衣在线观看一区二区| 日本成人黄色网| 欧美国产日韩精品免费观看| 自拍偷拍色综合| 视频在线观看99| 视频二区欧美| 农民人伦一区二区三区| av在线播放成人| 亚洲精品成人在线视频| 亚洲香蕉成人av网站在线观看 | 精品国产乱码久久久久软件| 亚洲人体大胆视频| 亚洲天堂久久新| 欧美色涩在线第一页| 国产视频在线播放| 国产精品国产精品| 午夜在线播放视频欧美| 小早川怜子久久精品中文字幕| 欧美色图12p| 伊人精品影院| 国产一区二区在线观看免费播放 | aaa一级黄色片| 亚洲综合免费观看高清完整版在线| 黄色av网址在线| 国产97在线观看| 亚洲国产精品日韩专区av有中文| 欧美成人精品一区二区综合免费| 同产精品九九九| 最新真实国产在线视频| 999精品视频一区二区三区| 亚洲三级毛片| 黄色激情小视频| 精品少妇一区二区三区日产乱码| 午夜精品久久久久久久久久蜜桃| 亚洲人成77777| 成人精品免费网站| www.av88| 久久久久免费视频| 精品免费一区二区| 美女流白浆视频| 色婷婷综合久久久久中文一区二区| 久cao在线| 国产一区二区三区黄| 美女在线观看视频一区二区| 中文字幕亚洲欧美日韩| 日韩精品免费在线视频观看| 亚洲精品大片| 国产91在线视频观看| 亚洲三级在线看| 国产综合在线观看| 国产高清在线一区| 久久99国产精品麻豆| 五月天婷婷久久| 色综合久久久888|