成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【前端】重構,有品位的代碼 07 ── 簡化條件邏輯

開發 架構
在程序編寫中,復雜的條件邏輯會導致算法復雜度上升,因為會根據不同的條件分支做出不同的事情,這樣便得到復雜冗長的函數。正如你所知道的,函數越大越長,代碼的可讀性就越低,在理解和閱讀就愈發困難。

[[410522]]

本文轉載自微信公眾號「前端萬有引力」,作者一川。轉載本文請聯系前端萬有引力公眾號。

簡化條件邏輯

常見的簡化條件邏輯方法有:

  • 分解條件表達式
  • 合并條件表達式
  • 以衛語句取代嵌套條件表達式
  • 以多態取代條件表達式
  • 引入特例
  • 引入斷言

1. 分解條件表達式

在程序編寫中,復雜的條件邏輯會導致算法復雜度上升,因為會根據不同的條件分支做出不同的事情,這樣便得到復雜冗長的函數。正如你所知道的,函數越大越長,代碼的可讀性就越低,在理解和閱讀就愈發困難。

在前面幾篇文章中,對于大塊頭函數可以根據功能意圖分解成幾個小型的函數,因此可以根據邏輯分支的意圖將條件邏輯函數分解。

原始代碼:

  1. if(!have.before(plan.summerStart) && !plan.after(plan.summerEnd)){ 
  2.   charge = quantity * plan.summerRate; 
  3. }else
  4.   charge = quantity * plan.regularRate + plan.regularServiceCharge; 

重構代碼:

  1. charge = summer() ? summerCharge() : regularCharge(); 
  2.  
  3. function summer(){ 
  4.   return !have.before(plan.summerStart()) && !have.aftet(plan.summerEnd()); 
  5.  
  6. function summerCharge(){ 
  7.   return quantity * plan.summerRate; 
  8.  
  9. function regularCharge(){ 
  10.   return quantity * plan.regularRate + plan.regularServiceCharge; 

2. 合并條件表達式

在進行代碼的條件檢查,檢查條件雖有不同,但是處理事件的行為卻是一致的。與其使用條件邏輯處理事件,不如使用邏輯『或』和『與』將其合并成條件表達式,分解冗長的函數代碼。使用條件表達式可以讓代碼閱讀更清晰,提煉函數可以將條件函數的代碼邏輯提煉成獨立函數,可理清代碼意義。

具體的,進行合并條件表達式之時,必先確定其是否具有副作用,將查詢函數和修改函數分離處理。使用適當的邏輯運算符,將兩個邏輯條件表達式合并成一個。

原始代碼:

  1. if(employee.seniority < 2) return 0; 
  2. if(employee.months > 12) return 0; 
  3. if(employee.timereturn 0; 

重構代碼:

  1. function func(){ 
  2.   return (employee.seniority < 2) || (employee.months > 12) || employee.time
  3.  
  4. if(func()) return 0; 

3. 以衛語句取代嵌套條件表達式

在條件表達式中通常有兩個風格:兩個條件分支都屬于正常行為,可以使用if...else...;只有一個條件分支時正常行為,另一個分支則是異常行為,即出現某個罕見條件應該單獨檢查(此為『衛語句』),條件為真時立刻從函數中返回。

所謂『衛語句』取代嵌套條件表達式,就是給其中的某分支給予特別的重視。其實就是對條件語句不是一視同仁,而是倚重其中最重要的分支語句,讓讀者閱讀代碼時能夠一眼便能看透邏輯。

原始代碼:

  1. function payMount(){ 
  2.   let result; 
  3.   if(isDead){ 
  4.     result = amountFunc(); 
  5.   }else
  6.     if(isSeparated){ 
  7.       result = separatedAmout(); 
  8.     }else
  9.       if(isRetired){ 
  10.         result = retiredAmount() 
  11.       }else
  12.         result = normalAmount(); 
  13.       } 
  14.     } 
  15.   } 
  16.   return result; 

重構代碼:

  1. function payMount(){ 
  2.   if(isDead) result = amountFunc(); 
  3.   if(isSeparated) result = separatedAmout(); 
  4.   if(isRetired) result = retiredAmount(); 
  5.   return normalAmount(); 

4. 以多態取代條件表達式

在編程中復雜的條件邏輯是相當難理解的代碼,與其尋求給條件邏輯添加結構,不如拆分分支條件到不同的場景,即高階用例。在拆解復雜的條件邏輯時,有時發現條件邏輯本身結構足以表達,但使用類和多態能把邏輯拆分表達更清晰。

如果現有的類尚不具備多態行為,可創建工廠函數返回恰當的對象實例,在調用方法時即可獲得對象實例。可以將帶有條件的函數移到超類中,如果條件邏輯還未提煉到獨立的函數。任選子類在其中創建函數,將其進行覆寫超類中容納條件表達式的函數,將子類相關條件表達式分支復制到新函數進行調整。

原始代碼:

  1. switch(user.type){ 
  2.   case "UserName"
  3.     return "yichuan"
  4.   case "UserAge"
  5.     return this.age > 18 ? "成年" : "未成年"
  6.   case "UserUniversity"
  7.     return this.score > 600 ? "985高校" : "非985高校"
  8.   default
  9.     return "unknown"

重構代碼:

  1. class UserName{ 
  2.   get detail(){ 
  3.     return "yichuan"
  4.   } 
  5.  
  6. class UserAge{ 
  7.   get detail(){ 
  8.     return this.age > 18 ? "成年" : "未成年"
  9.   } 
  10.  
  11. class UserUniversity{ 
  12.   get detail(){ 
  13.     return this.score > 600 ? "985高校" : "非985高校"
  14.   } 

5. 引入特例

常見的重復代碼是:一個數據結構的使用者都在檢查某個特殊的值,且當這個特殊值出現時多做的處理也同樣。如果發現代碼中在多處以相同方式應對同個特殊值,就可以將處理邏輯整合在一塊。

處理重復代碼最好的方法時使用『特例』模式,創建一個特例元素,用來處理特例的共用行為,可用一個函數調用取代部分特例檢查邏輯。

通常的,特例有幾種表現形式,我們可以對常見方式進行處理。如:

  • 只從對象中讀取數據,可以提供一個預先填充值的字面量對象
  • 除獲取簡單數值外還需更多行為,則可以創建保函所有共有行為所對應的函數
  • 特例對象可以封裝成類進行返回,亦可通過變換插入數據結構
  1. //原始代碼 
  2. if(flag === "unkown"name = "yichuan"
  3.  
  4. //重構代碼 
  5. class User
  6.   get name(){ 
  7.     return "yichuan"
  8.   } 

6. 引入斷言

在進行程序開發時,只有當某個條件為真時代碼才能正常運行,常規做法是使用注釋進行解釋。而使用斷言可以明確標明假設,因為其時一個條件表達式,應當總是恒等于真,斷言的失敗不應該被系統任何地方捕獲。

斷言在交流上具有很高的價值,可以解決了當下正在追蹤的錯誤,但是自測代碼降低了斷言在調試過程中的價值,因為逐步逼近的單元測試通常有助于調試。

原始代碼:

  1. func(num){ 
  2.   return (discountRate) ? num - (discountRate * num) : num; 

重構代碼:

  1. set discountRate(num){ 
  2.   assert(null === num || num >= 0); 
  3.   discountRate= num;   

小結

在本文中,主要介紹了如何簡化條件邏輯,可以對條件邏輯進行操作,而代碼也變得更加清晰易懂。

參考文章

《重構──改善既有代碼的設計(第2版)》

 

責任編輯:武曉燕 來源: 前端萬有引力
相關推薦

2022-04-21 07:20:39

Javascript重構邏輯

2021-07-01 08:28:24

前端搬移特性開發技術

2021-08-03 08:13:48

重構API代碼

2021-07-03 12:28:30

前端數據代碼

2025-03-11 11:40:00

三元運算符代碼JavaScript

2010-09-03 14:56:12

SQLSELECT語句

2025-05-06 09:20:00

JavaScript開發條件邏輯

2013-09-16 10:57:59

蘋果世界

2021-06-05 05:11:52

代碼狀態機邏輯

2020-06-10 08:37:21

JavaScript重構技巧

2020-12-08 06:20:49

前端重構Vue

2021-06-23 10:32:24

前端ES6代碼

2024-09-05 10:17:34

2013-04-12 10:17:56

重構業務邏輯

2013-06-09 10:37:14

架構框架

2024-06-24 08:10:34

Java8表達式IDE

2022-08-08 13:24:28

整潔架構架構前端

2012-07-27 10:30:12

重構

2025-03-03 01:25:00

classnameAPI前端

2025-04-28 10:13:03

JavaScript數組代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 九九亚洲| 免费黄色av网站 | 99伊人| 2021狠狠干 | 91青青草视频 | 亚洲成人网在线 | 男人天堂久久 | 在线观看国产视频 | av网站免费看 | 激情久久网 | 精久久久 | 日本精品裸体写真集在线观看 | 一级亚洲| 欧美久久久久久久久中文字幕 | 水蜜桃久久夜色精品一区 | 欧美一级在线 | 精品一区二区三区四区五区 | 一区二区三区视频 | 国产三级一区二区三区 | 中文字幕一区二区在线观看 | 国产操操操 | 日韩在线一区二区三区 | 色吧综合网 | 国产欧美三区 | 国产成人综合久久 | 亚洲国产一区二区三区在线观看 | 久草.com | a在线v| 国产乱码精品一区二区三区五月婷 | 亚洲综合色视频在线观看 | 成人自拍视频网站 | 在线视频一区二区 | 亚洲精品一区二区 | 99精品国产一区二区三区 | www.久久久久久久久久久 | 亚洲 欧美 日韩在线 | 国产精品自产拍 | 美女在线视频一区二区三区 | 婷婷福利视频导航 | 久久久久www | 欧美精品在线一区 |