日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
【前端】重構(gòu),有品位的代碼07──簡化條件邏輯

本文轉(zhuǎn)載自微信公眾號「前端萬有引力」,作者一川。轉(zhuǎn)載本文請聯(lián)系前端萬有引力公眾號。

創(chuàng)新互聯(lián)主要為客戶提供服務(wù)項(xiàng)目涵蓋了網(wǎng)頁視覺設(shè)計(jì)、VI標(biāo)志設(shè)計(jì)、成都全網(wǎng)營銷推廣、網(wǎng)站程序開發(fā)、HTML5響應(yīng)式成都網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站建設(shè)、微商城、網(wǎng)站托管及成都網(wǎng)站維護(hù)、WEB系統(tǒng)開發(fā)、域名注冊、國內(nèi)外服務(wù)器租用、視頻、平面設(shè)計(jì)、SEO優(yōu)化排名。設(shè)計(jì)、前端、后端三個(gè)建站步驟的完善服務(wù)體系。一人跟蹤測試的建站服務(wù)標(biāo)準(zhǔn)。已經(jīng)為酒樓設(shè)計(jì)行業(yè)客戶提供了網(wǎng)站制作服務(wù)。

簡化條件邏輯

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

  • 分解條件表達(dá)式
  • 合并條件表達(dá)式
  • 以衛(wèi)語句取代嵌套條件表達(dá)式
  • 以多態(tài)取代條件表達(dá)式
  • 引入特例
  • 引入斷言

1. 分解條件表達(dá)式

在程序編寫中,復(fù)雜的條件邏輯會(huì)導(dǎo)致算法復(fù)雜度上升,因?yàn)闀?huì)根據(jù)不同的條件分支做出不同的事情,這樣便得到復(fù)雜冗長的函數(shù)。正如你所知道的,函數(shù)越大越長,代碼的可讀性就越低,在理解和閱讀就愈發(fā)困難。

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

原始代碼:

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

重構(gòu)代碼:

 
 
 
  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. 合并條件表達(dá)式

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

具體的,進(jìn)行合并條件表達(dá)式之時(shí),必先確定其是否具有副作用,將查詢函數(shù)和修改函數(shù)分離處理。使用適當(dāng)?shù)倪壿嬤\(yùn)算符,將兩個(gè)邏輯條件表達(dá)式合并成一個(gè)。

原始代碼:

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

重構(gòu)代碼:

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

3. 以衛(wèi)語句取代嵌套條件表達(dá)式

在條件表達(dá)式中通常有兩個(gè)風(fēng)格:兩個(gè)條件分支都屬于正常行為,可以使用if...else...;只有一個(gè)條件分支時(shí)正常行為,另一個(gè)分支則是異常行為,即出現(xiàn)某個(gè)罕見條件應(yīng)該單獨(dú)檢查(此為『衛(wèi)語句』),條件為真時(shí)立刻從函數(shù)中返回。

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

原始代碼:

 
 
 
  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; 

重構(gòu)代碼:

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

4. 以多態(tài)取代條件表達(dá)式

在編程中復(fù)雜的條件邏輯是相當(dāng)難理解的代碼,與其尋求給條件邏輯添加結(jié)構(gòu),不如拆分分支條件到不同的場景,即高階用例。在拆解復(fù)雜的條件邏輯時(shí),有時(shí)發(fā)現(xiàn)條件邏輯本身結(jié)構(gòu)足以表達(dá),但使用類和多態(tài)能把邏輯拆分表達(dá)更清晰。

如果現(xiàn)有的類尚不具備多態(tài)行為,可創(chuàng)建工廠函數(shù)返回恰當(dāng)?shù)膶ο髮?shí)例,在調(diào)用方法時(shí)即可獲得對象實(shí)例。可以將帶有條件的函數(shù)移到超類中,如果條件邏輯還未提煉到獨(dú)立的函數(shù)。任選子類在其中創(chuàng)建函數(shù),將其進(jìn)行覆寫超類中容納條件表達(dá)式的函數(shù),將子類相關(guān)條件表達(dá)式分支復(fù)制到新函數(shù)進(jìn)行調(diào)整。

原始代碼:

 
 
 
  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"; 

重構(gòu)代碼:

 
 
 
  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. 引入特例

常見的重復(fù)代碼是:一個(gè)數(shù)據(jù)結(jié)構(gòu)的使用者都在檢查某個(gè)特殊的值,且當(dāng)這個(gè)特殊值出現(xiàn)時(shí)多做的處理也同樣。如果發(fā)現(xiàn)代碼中在多處以相同方式應(yīng)對同個(gè)特殊值,就可以將處理邏輯整合在一塊。

處理重復(fù)代碼最好的方法時(shí)使用『特例』模式,創(chuàng)建一個(gè)特例元素,用來處理特例的共用行為,可用一個(gè)函數(shù)調(diào)用取代部分特例檢查邏輯。

通常的,特例有幾種表現(xiàn)形式,我們可以對常見方式進(jìn)行處理。如:

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

6. 引入斷言

在進(jìn)行程序開發(fā)時(shí),只有當(dāng)某個(gè)條件為真時(shí)代碼才能正常運(yùn)行,常規(guī)做法是使用注釋進(jìn)行解釋。而使用斷言可以明確標(biāo)明假設(shè),因?yàn)槠鋾r(shí)一個(gè)條件表達(dá)式,應(yīng)當(dāng)總是恒等于真,斷言的失敗不應(yīng)該被系統(tǒng)任何地方捕獲。

斷言在交流上具有很高的價(jià)值,可以解決了當(dāng)下正在追蹤的錯(cuò)誤,但是自測代碼降低了斷言在調(diào)試過程中的價(jià)值,因?yàn)橹鸩奖平膯卧獪y試通常有助于調(diào)試。

原始代碼:

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

重構(gòu)代碼:

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

小結(jié)

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

參考文章

《重構(gòu)──改善既有代碼的設(shè)計(jì)(第2版)》


網(wǎng)站標(biāo)題:【前端】重構(gòu),有品位的代碼07──簡化條件邏輯
文章網(wǎng)址:http://www.dlmjj.cn/article/cdppjhe.html