日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

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

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

什么是意大利面條代碼?

所謂“意大利面條代碼”在處理復雜業務過程時很常見。它通常具有以下特點:d3Q28資訊網——每日最新資訊28at.com

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

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

if…if 類型

這種代碼結構看起來像這樣:d3Q28資訊網——每日最新資訊28at.com

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)) {    // ...  }}

其流程圖如下:d3Q28資訊網——每日最新資訊28at.com

圖片圖片d3Q28資訊網——每日最新資訊28at.com

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

else if…else if 類型

這種代碼控制流也很常見,看起來像這樣:d3Q28資訊網——每日最新資訊28at.com

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)) {    // ...  }}

其流程圖如下:d3Q28資訊網——每日最新資訊28at.com

圖片圖片d3Q28資訊網——每日最新資訊28at.com

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

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

重構策略

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

圖片圖片d3Q28資訊網——每日最新資訊28at.com

基本情況d3Q28資訊網——每日最新資訊28at.com

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

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

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

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

通過這種方式,我們解決了 if…if 類型的面條代碼;那么else if…else if類型的呢?d3Q28資訊網——每日最新資訊28at.com

查找表

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

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 中的邏輯被重寫為一個獨立的函數,然后我們可以按以下方式拆分過程:d3Q28資訊網——每日最新資訊28at.com

圖片圖片d3Q28資訊網——每日最新資訊28at.com

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

責任鏈模式

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

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

圖片圖片d3Q28資訊網——每日最新資訊28at.com

d3Q28資訊網——每日最新資訊28at.com

在代碼實現中,我們可以通過責任鏈數組定義等價于else if的規則。d3Q28資訊網——每日最新資訊28at.com

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 函數重寫為遍歷責任鏈數組:d3Q28資訊網——每日最新資訊28at.com

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 邏輯拆分為單獨的部分。d3Q28資訊網——每日最新資訊28at.com

結尾

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

然而,解決這個問題其實并不復雜。這些示例之所以簡單,基本上是因為強大的高級編程d3Q28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-99171-0.html擺脫 if-else 束縛的清潔編碼之旅:這些技術幫你實現

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 為什么要限流?及常用的限流算法解析

下一篇: 你合并代碼用 Merge 還是用 Rebase ?

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
在线亚洲+欧美+日本专区| 黄色国产精品| 欧美日本一区| 欧美日韩在线观看一区二区三区| 欧美视频一区二区三区在线观看| 欧美性做爰猛烈叫床潮| 国产日韩精品入口| 亚洲成人在线网| 日韩一区二区精品在线观看| 亚洲视频在线二区| 久久国产精品久久久久久久久久 | 国产精品久久久999| 国产免费成人av| 亚洲国产精品久久精品怡红院 | 亚洲欧美中文另类| 久久全球大尺度高清视频| 欧美精品1区2区| 国产日本欧美在线观看| 亚洲第一中文字幕| 亚洲视频中文字幕| 久久婷婷人人澡人人喊人人爽| 欧美欧美午夜aⅴ在线观看| 国产欧美精品在线| 亚洲精品久久久久久久久| 亚洲一区二区不卡免费| 久久久91精品国产| 欧美日韩在线观看一区二区| 黑人极品videos精品欧美裸| 中文av一区特黄| 美女图片一区二区| 国产酒店精品激情| 亚洲精品中文字幕在线| 久久精品成人| 欧美色123| 亚洲电影欧美电影有声小说| 亚洲欧美日韩国产综合| 欧美精品久久一区二区| 国产一区 二区 三区一级| 日韩天堂av| 快播亚洲色图| 国产日产欧美一区| 一区二区三区四区五区在线| 麻豆成人在线观看| 国产欧美日本一区二区三区| 99热免费精品| 老司机午夜免费精品视频| 国产欧美视频一区二区三区| 一本色道久久综合狠狠躁篇的优点| 久久久久久欧美| 国产毛片一区二区| 一本到12不卡视频在线dvd| 另类尿喷潮videofree| 国产精品影院在线观看| 一区二区高清视频| 欧美高清免费| 激情综合网激情| 性欧美大战久久久久久久久| 欧美日韩一区在线观看| 亚洲激情网站| 噜噜噜躁狠狠躁狠狠精品视频| 国产欧美91| 午夜一级在线看亚洲| 国产精品二区影院| 日韩一区二区精品| 欧美国产在线观看| 亚洲成人在线免费| 久久久久**毛片大全| 国产小视频国产精品| 性高湖久久久久久久久| 国产精品高潮视频| 一二三区精品福利视频| 欧美精品v国产精品v日韩精品 | 在线不卡欧美| 久久免费国产| 国产在线精品一区二区中文| 性欧美精品高清| 国产乱子伦一区二区三区国色天香 | 永久免费毛片在线播放不卡| 久久成人一区| 国产主播一区二区三区| 欧美专区亚洲专区| 国产午夜精品久久久久久久| 欧美一区二区久久久| 国产精品在线看| 亚洲欧美制服另类日韩| 国产女人aaa级久久久级| 欧美一区二区三区在| 国产亚洲精品高潮| 久久国产毛片| 伊人夜夜躁av伊人久久| 麻豆9191精品国产| 亚洲黄色一区二区三区| 欧美第一黄色网| 99re在线精品| 欧美性猛交99久久久久99按摩| 亚洲一区日本| 国产欧美一区二区视频| 久久精品91久久香蕉加勒比| 国外成人性视频| 美日韩精品视频免费看| 亚洲精品免费一区二区三区| 欧美日韩在线大尺度| 亚洲影院污污.| 国产日韩在线看| 久久人人爽爽爽人久久久| 亚洲激情不卡| 欧美日韩在线精品一区二区三区| 亚洲午夜免费视频| 国产日韩在线一区| 老司机久久99久久精品播放免费| 亚洲日本中文| 国产精品久久99| 午夜精品美女自拍福到在线 | 国产三级欧美三级| 免费在线一区二区| 一区二区三区欧美亚洲| 国产欧美1区2区3区| 久久一区视频| 亚洲免费观看视频| 国产精品亚洲成人| 久久香蕉精品| 一本色道久久综合狠狠躁篇的优点| 国产精品久久影院| 久久另类ts人妖一区二区| 亚洲精品国产精品国产自| 欧美天天在线| 久久久999精品| 亚洲精品极品| 国产日韩欧美电影在线观看| 免费观看国产成人| 亚洲一区二区视频在线| 红桃视频欧美| 欧美日韩成人一区| 欧美在线视频一区二区三区| 亚洲黄色影院| 国产伦一区二区三区色一情| 嫩草影视亚洲| 午夜激情综合网| 亚洲国产一区二区三区a毛片| 国产精品人人做人人爽人人添 | 国产日产精品一区二区三区四区的观看方式 | 亚洲欧美在线免费| 亚洲国产精品悠悠久久琪琪| 国产精品国产三级国产aⅴ浪潮 | 在线成人h网| 国产精品久在线观看| 蜜桃av噜噜一区| 午夜精品视频在线观看| 亚洲人成人77777线观看| 国产麻豆午夜三级精品| 欧美激情导航| 久久久噜噜噜久久中文字免| 亚洲一区二区三区中文字幕在线 | 国产精品久久久久久一区二区三区 | 欧美激情一二三区| 欧美在线观看一区| 日韩视频第一页| 国内精品国产成人| 国产精品二区在线| 欧美极品色图| 久久理论片午夜琪琪电影网| 亚洲一区二区三区午夜| 亚洲理论在线| 永久555www成人免费| 国产精品一区二区久久国产| 欧美精品1区2区| 久久亚洲私人国产精品va媚药| 午夜精品视频在线观看| 亚洲作爱视频| 亚洲黄色av| 在线不卡中文字幕| 国产日韩欧美在线看| 国产精品久久久久av免费| 欧美精品18videos性欧美| 久久综合色88| 久久久国产精品一区二区三区| 亚洲免费在线看| 亚洲视频免费在线观看| 亚洲精品在线电影| 亚洲成人在线视频播放| 狠狠色丁香婷婷综合| 国产欧美成人| 国产免费亚洲高清| 国产精品久久久久高潮| 欧美日韩亚洲一区二区三区四区 | 免费高清在线视频一区·| 欧美在线视频播放| 午夜精品视频| 午夜精品久久| 亚洲欧美成人网| 亚洲性夜色噜噜噜7777| 一本一道久久综合狠狠老精东影业| 亚洲日本无吗高清不卡| 亚洲人成网站777色婷婷| 亚洲第一福利社区| 在线观看国产一区二区| 一区二区自拍| 一区二区亚洲欧洲国产日韩| 国产一区二区三区黄| 国产日韩综合| 国产日韩欧美在线播放不卡| 国产欧美一区二区精品性色| 国产热re99久久6国产精品| 国产日韩欧美综合一区|