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

從if else 到 switch case再到抽象

開發(fā) 后端
作者認為超過超過兩個else的if ,或者是超過兩個case 的switch的語句比較復(fù)雜,為什么這么說?一起來看作者的觀點吧!!

大家覺得在接手遺留代碼時,見到什么東東是最讓人感到不耐煩的?復(fù)雜無比的 UML ?我覺得不是。我的答案是,超過兩個 else 的if ,或者是超過兩個case的switch 。可是在代碼中大量使用 if else switch case 是很正常的事情吧?錯!絕大多數(shù)分支超過兩個的 if else 和 switch case 都不應(yīng)該以硬編碼( hard-coded )的形式出現(xiàn)。

復(fù)雜分支從何而來

首先我們要討論的***個問題是,為什么遺留代碼里面往往有那么多復(fù)雜分支。這些復(fù)雜分支在代碼的***版本中往往是不存在的,假設(shè)做設(shè)計的人還是有點經(jīng)驗的話,他應(yīng)該預(yù)見將來可能需要進行擴展的地方,并且預(yù)留抽象接口。

但是代碼經(jīng)過若干個版本的迭代以后,尤其是經(jīng)過若干次需求細節(jié)的調(diào)整以后,復(fù)雜分支就會出現(xiàn)了。需求的細節(jié)調(diào)整,往往不會反映到 UML 上,而會直接反映到代碼上。例如說,原本消息分為聊天消息和系統(tǒng)消息兩類,設(shè)計的時候自然會把這設(shè)計為消息類的兩個子類。但接著有一天需求發(fā)生細節(jié)調(diào)整了,系統(tǒng)消息里面有一部分是重要的,它們的標題要顯示為紅色,這時候程序員往往會做如下修改:

1.在系統(tǒng)消息類上面加一個 important 屬性

2.在相應(yīng)的 render 方法里面加入一個關(guān)于 important 屬性的分支,用于控制標題顏色

程序員為什么會作出這樣的修改?有可能因為他沒意識到應(yīng)該抽象。因為需求說的是「系統(tǒng)消息里面有一部分是重要的」,對于接受命令式編程語言訓(xùn)練比較多的程序員來說,他或許首先想到的是標志位──一個標志位就可以區(qū)分重要跟不重要。他沒想到這個需求可以用另一種方式來解讀,「系統(tǒng)消息分為重要和不重要兩種類別」。這樣子解讀,他就知道應(yīng)該對系統(tǒng)消息進行抽象了。
當然也有可能,程序員知道可以抽象,但基于某些原因,他選擇了不這樣做。很常見的一種情況就是有人逼著程序員,以犧牲代碼質(zhì)量來換取項目進展速度──加入一個屬性和一個分支,遠比抽象重構(gòu)要簡單得多,如果要做10個這種形式的修改,是做10個分支快還是做10個抽象快?區(qū)別顯而易見。

當然, if else 多了,就有聰明人站出來說「不如我們改成 switch case 」吧。在某些情況下,這確實能夠提升代碼可讀性,假設(shè)每一個分支都是互斥的話。但是當 switch case 的數(shù)量也多起來以后,代碼一樣會變得不可讀。

復(fù)雜分支有何壞處

復(fù)雜分支有什么壞處?讓我從百度 Hi 網(wǎng)頁版的老代碼里面截取一段出來做個例子。

  1. switch (json.result) {    
  2. case "ok":      
  3. switch (json.command) {        
  4. case "message":        
  5. case "systemmessage":          
  6. if (json.content.from == ""            
  7. && json.content.content == "kicked") {            
  8. /* disconnect */          
  9. else if (json.command == "systemmessage"            
  10. || json.content.type == "sysmsg") {            
  11. /* render system message */          
  12. else {            
  13. /* render chat message */          
  14. }          
  15. break;      
  16. }     
  17.  break;  

這段代碼要看懂不難,因此我提一個簡單問題,以下這個 JSON 命中哪個分支:

  1. "result""ok",   
  2. "command""message",   
  3. "content": { "from""CatChen",   
  4. "content""Hello!" } } 

你很容易就能得到正確答案:這個 JSON 命中 /* render chat message */ (顯示聊天消息)這個分支。那么我想了解一下,你是如何作出這個判斷的?首先,你要看它是否命中 case “ok”: 分支,結(jié)果是命中了;然后,你要看它是否命中 case “message”: 分支,結(jié)果也是命中了,所以 case “systemmessage”: 就不用看了;接下來,它不命中 if 里面的條件;并且,它也不命中 else if 里面的條件,所以它命中了 else 這個分支。

看出問題來了嗎?為什么你不能看著這個 else 就說出這個 JSON 命中這個分支?因為 else 本身不包含任何條件,它只隱含條件!每一個 else 的條件,都是對它之前的每一個 if 和 else if 進行先非后與運算的結(jié)果。也就是說,判斷命中這個 else ,相當于判斷命中這樣一組復(fù)雜的條件:

  1. !(json.content.from == "" && json.content.content == "kicked") &&   
  2. !(json.command == "systemmessage" || json.content.type == "sysmsg"

再套上外層的兩個 switch case ,這個分支的條件就是這樣子的:

  1. json.result == "ok" &&   
  2. (json.command == "message" ||   
  3. json.command == "systemmessage") &&   
  4. !(json.content.from == "" &&   
  5. json.content.content == "kicked") &&   
  6. !(json.command == "systemmessage" ||   
  7. json.content.type == "sysmsg"

這里面有重復(fù)邏輯,省略后是這樣子的:

  1. json.result == "ok" &&   
  2. json.command == "message" &&   
  3. !(json.content.from == "" &&   
  4. json.content.content == "kicked") &&   
  5. !(json.content.type == "sysmsg"

我們花了多大力氣才從簡簡單單的 else 這四個字母中推導(dǎo)出這樣一長串邏輯運算表達式來?況且,不仔細看還真的看不懂這個表達式說的是什么。

這就是復(fù)雜分支難以閱讀和管理的地方。想象你面對一個 switch case 套一個 if else ,總共有3個 case ,每個 case 里面有3個 else ,這就夠你研究的了──每一個分支,條件中都隱含著它所有前置分支以及所有祖先分支的前置分支先非后與的結(jié)果。

如何避免復(fù)雜分支

首先,復(fù)雜邏輯運算是不能避免的。重構(gòu)得到的結(jié)果應(yīng)該是等價的邏輯,我們能做的只是讓代碼變得更加容易閱讀和管理。因此,我們的重點應(yīng)該在于如何使得復(fù)雜邏輯運算變得易于閱讀和管理。

抽象為類或者工廠

對于習(xí)慣于做面向?qū)ο笤O(shè)計的人來說,可能這意味著將復(fù)雜邏輯運算打散并分布到不同的類里面:

  1. switch (json.result)   
  2. {  
  3. case "ok":  
  4.  var factory = commandFactories.getFactory(json.command);   
  5. var command = factory.buildCommand(json);   
  6. command.execute();  
  7.  break; } 

這看起來不錯,至少分支變短了,代碼變得容易閱讀了。這個 switch case 只管狀態(tài)碼分支,對于 “ok” 這個狀態(tài)碼具體怎么處理,那是其他類管的事情。 getFactory 里面可能有一組分支,專注于創(chuàng)建這條指令應(yīng)該選擇哪一個工廠的選擇。同時 buildCommand 可能又有另外一些瑣碎的分支,決定如何構(gòu)建這條指令。

這樣做的好處是,分支之間的嵌套關(guān)系解除了,每一個分支只要在自己的上下文中保持正確就可以了。舉個例子來說, getFactory 現(xiàn)在是一個具名函數(shù),因此這個函數(shù)內(nèi)的分支只要實現(xiàn) getFactory 這個名字暗示的契約就可以了,無需關(guān)注實際調(diào)用 getFactory 的上下文。

抽象為模式匹配

另外一種做法,就是把這種復(fù)雜邏輯運算轉(zhuǎn)述為模式匹配:

  1. Network.listen({  "result""ok",   
  2.  "command""message",    
  3. "content": { "from""""content""kicked" } },  
  4.  function(json) { /* disconnect */ });   
  5. Network.listen([{  "result""ok",   
  6.  "command""message",    
  7. "content": { "type""sysmsg" } },   
  8. {  "result""ok",  "command""systemmessage" }], function(json) { /* render system message */ });   
  9. Network.listen({  "result""ok",    
  10. "command""message",   
  11.  "content": { "from$ne""",   
  12. "type$ne""sysmsg" } },   
  13. function(json) { /* render chat message */ }); 

現(xiàn)在這樣子是不是清晰多了?***種情況,是被踢下線,必須匹配指定的 from 和 content 值。第二種情況,是顯示系統(tǒng)消息,由于系統(tǒng)消息在兩個版本的協(xié)議中略有不同,所以我們要捕捉兩種不同的 JSON ,匹配任意一個都算是命中。第三種情況,是顯示聊天消息,由于在老版本協(xié)議中系統(tǒng)消息和踢下線指令都屬于特殊的聊天消息,為了兼容老版本協(xié)議,這兩種情況要從顯示聊天消息中排除出去,所以就使用了 “$ne” (表示 not equal )這樣的后綴進行匹配。

由于 listen 方法是上下文無關(guān)的,每一個 listen 都獨立聲明自己匹配什么樣的 JSON ,因此不存在任何隱含邏輯。例如說,要捕捉聊天消息,就必須顯式聲明排除 from == “” 以及 type == “sysmsg” 這兩種情況,這不需要由上下文的 if else 推斷得出。
使用模式匹配,可以大大提高代碼的可讀性和可維護性。

由于我們要捕捉的是 JSON ,所以我們就使用 JSON 來描述每一個分支要捕捉什么,這比一個長長的邏輯運算表達式要清晰多了。同時在這個 JSON 上的每一處修改都是獨立的,修改一個條件并不影響其他條件。

【編輯推薦】

  1. C/C++是程序員必須掌握的語言嗎?
  2. 用C語言的rand()和srand()產(chǎn)生偽隨機數(shù)的方法總結(jié)
  3. JavaScript 假如default不是switch的***一項
  4. 關(guān)于 JavaScript 的 with 語句
  5. 快速排序(Quicksort)的Javascript實現(xiàn)
責(zé)任編輯:于鐵 來源: 百度泛用戶體驗
相關(guān)推薦

2023-12-20 14:44:33

軟件開發(fā)DevOpsNoOps

2016-11-28 16:23:23

戴爾

2020-07-16 15:20:13

switch...caif...else語言

2020-05-17 13:59:37

物聯(lián)網(wǎng)工業(yè)物聯(lián)網(wǎng)工業(yè)4.0

2020-08-13 17:18:20

Kubernetes邊緣容器

2019-04-11 15:45:08

ReactMixin前端

2013-04-08 17:13:14

2017-09-12 15:26:44

2009-08-19 10:41:14

C# switch和c

2021-08-12 18:48:31

響應(yīng)式編程Bio

2023-06-07 08:35:36

2009-06-08 21:45:46

Javaswitch-case

2009-07-01 10:11:04

.NETLINQ

2024-12-23 08:00:45

2021-04-20 19:23:07

語法switch-casePython

2023-05-24 09:00:28

DTW邊緣計算APEX

2020-11-23 09:37:22

Python開發(fā)函數(shù)

2017-06-28 10:49:28

PCIe Switch邊緣核心

2024-09-18 15:19:54

數(shù)據(jù)倉庫數(shù)據(jù)飛輪醫(yī)療數(shù)據(jù)

2019-09-09 16:33:10

華為
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲色图第四色| av免费观看网| 精品久久久无码中文字幕| 国产精品vip| 亚洲国产精彩中文乱码av| 男人揉女人奶房视频60分| 成黄免费在线| 成人妖精视频yjsp地址| 国产成人97精品免费看片| 少妇aaaaa| 亚洲精品国模| 日韩免费性生活视频播放| 波多野结衣家庭教师在线| 亚洲成人影院麻豆| av色综合久久天堂av综合| 国产欧美日韩中文| 国产一级精品视频| 欧美在线91| 国产一区二区精品丝袜| www.四虎精品| 动漫一区二区三区| 色综合天天综合网天天狠天天 | 男男受被啪到高潮自述| 午夜小视频在线观看| 国产成人精品999在线观看| 欧美日韩国产乱码电影| 极品粉嫩国产18尤物| www日韩tube| 99久久精品国产观看| 国产日本欧美视频| 精品国产乱子伦| 亚洲国内自拍| 久久6免费高清热精品| 中文字幕免费高清| 欧美人与动xxxxz0oz| 欧美一区二区二区| 国产福利在线免费| 欧美xxxx做受欧美护士| 亚洲成av人片在www色猫咪| 一区二区三区四区五区视频| 日韩大胆人体| 99久久精品一区二区| 超碰97网站| 国产老妇伦国产熟女老妇视频| 视频一区欧美日韩| 97在线视频观看| 国产一级大片在线观看| 亚洲色图网站| www国产91| 香蕉久久久久久久| 经典一区二区| 亚洲人成亚洲人成在线观看| 亚洲观看黄色网| 91成人噜噜噜在线播放| 日韩一区国产二区欧美三区| 天天摸天天舔天天操| 91手机视频在线观看| 久久久久久国产精品无码| 日韩成人av在线资源| 亚洲国产精品美女| 成人免费无码大片a毛片| 国产精伦一区二区三区| 亚洲成人网久久久| av鲁丝一区鲁丝二区鲁丝三区| 国产成人tv| 日韩成人av在线| 日本japanese极品少妇| 日韩精品免费一区二区三区竹菊| 亚洲国产毛片完整版| 中文字幕丰满孑伦无码专区| 免费视频一区三区| 国产一级揄自揄精品视频| 9.1片黄在线观看| 97视频精品| 九九热这里只有在线精品视| 久久久全国免费视频| 亚洲高清成人| 欧洲一区二区视频| 在线视频免费观看一区| 国产精品18久久久久久久久久久久| 99免费在线观看视频| 污污网站免费在线观看| 久久夜色精品国产欧美乱极品| 日本一区二区不卡高清更新| 一区二区三区视频在线观看视频| 亚洲激情在线播放| 欧美日本视频在线观看| a成人v在线| 欧美大片一区二区| 日韩在线免费观看av| 国产伦精品一区二区三区视频 | www 日韩| 亚洲一区日韩精品中文字幕| 成人免费无码av| 韩国一区二区三区视频| 亚洲国产中文字幕久久网| 特级西西人体wwwww| 91九色精品| 97免费视频在线播放| 中文字幕久久久久| 白白色亚洲国产精品| 亚洲精品一区二| gogo久久| 欧美另类z0zxhd电影| 人妻av一区二区| 欧美r级电影| 2025国产精品视频| 国产精品一区二区免费视频| www一区二区| 红桃一区二区三区| 成人黄色视屏网站| 亚洲娇小xxxx欧美娇小| 中国毛片直接看| 日韩中文字幕一区二区三区| 97视频中文字幕| a√资源在线| 精品福利在线观看| 少妇丰满尤物大尺度写真| 成人在线免费观看91| 欧美人与性动交| ,亚洲人成毛片在线播放| 91丨porny丨在线| 青青视频免费在线| 日韩伦理一区二区| 亚洲视频视频在线| 特一级黄色大片| 高清av一区二区| 最新av在线免费观看| 国精产品一区一区三区四川| 亚洲高清福利视频| 久久黄色免费网站| 久久97超碰国产精品超碰| 欧美一区二区在线视频观看| 伊人成综合网站| 亚洲国语精品自产拍在线观看| 日韩欧美综合视频| 久久激五月天综合精品| 日韩色妇久久av| 伊人久久综合一区二区| 亚洲国产精品99| 精品无码久久久久久久| 国产91精品一区二区麻豆亚洲| 伊人久久青草| 亚洲美女色播| yw.139尤物在线精品视频| 中文字幕一区二区在线视频 | 蜜桃视频一区| 久久资源av| 亚洲国产福利| 日韩精品久久久久| 可以在线观看av的网站| aaa国产一区| 国产xxxxx在线观看| 午夜精品福利影院| 国产成人亚洲综合91| 日本亚洲一区| 日韩欧美aaa| av网站免费在线看| 麻豆精品久久久| 中文字幕一区二区三区精彩视频 | 欧美一级片免费看| 久草成人在线视频| 成人美女在线视频| 一女被多男玩喷潮视频| 国产成人1区| 国产精品视频26uuu| 蜜桃视频在线观看www社区 | 视频在线不卡| 日本久久电影网| 亚洲天堂av中文字幕| 美女免费视频一区二区| 99视频精品全部免费看| 91综合精品国产丝袜长腿久久| 97视频在线播放| 国内精品一区视频| 91精品婷婷国产综合久久性色| 中文字幕在线观看成人| av不卡在线观看| 91国产精品视频在线观看| 亚洲精品a级片| 国产成人精品一区二区三区福利| 欧美极品videos大乳护士| 亚洲视频自拍偷拍| 国产喷水福利在线视频| 偷拍日韩校园综合在线| 国产一二三四区在线| 国产精品99久久久久久宅男| 亚洲熟妇av一区二区三区漫画| 成人高清av| 成人免费视频网站入口| 欧美freesex| 欧美精品在线看| 你懂的在线观看视频网站| 精品视频一区三区九区| 欧美日韩中文视频| 亚洲国产高清aⅴ视频| 好吊操视频这里只有精品| 日韩高清一级片| 男人添女人下部视频免费| 精品欧美久久| 国产精品一区二区三区观看| 日韩av超清在线观看| 欧美激情精品久久久久久变态 | 美日韩精品视频免费看| 青青国产在线| 日韩精品一区二区三区在线观看| 久久久成人免费视频| 一区二区不卡在线视频 午夜欧美不卡在| www.88av| 国产99久久久国产精品免费看| 日韩无套无码精品| 亚洲国产一区二区精品专区| 中文字幕制服丝袜在线| 欧美日韩在线播放视频| 国产无套精品一区二区| 日韩三级网址| 国产一区在线播放| 婷婷午夜社区一区| 国产91|九色| 欧美性爽视频| 久久精品中文字幕一区| 国产美女性感在线观看懂色av | av影片免费在线观看| 亚洲精品国产精品国产自| 国产99对白在线播放| 欧美日韩一卡二卡三卡 | 欧美家庭影院| 久久久91精品国产| 欧美jizzhd69巨大| 中文字幕日韩欧美在线视频| 偷拍精品一区二区三区| 精品国产伦一区二区三区观看方式 | 欧美日韩另类国产亚洲欧美一级| 麻豆久久久久久久久久| 亚洲国产综合在线| 久久午夜无码鲁丝片午夜精品| 中文字幕在线视频一区| 国产传媒国产传媒| 久久久精品国产免费观看同学| 国产精品300页| 99国内精品久久| 欧美在线一级片| 99免费精品视频| 网站免费在线观看| 99久久精品国产毛片| 91视频在线免费| 99久久夜色精品国产网站| 日韩av手机在线播放| 99免费精品视频| 三上悠亚ssⅰn939无码播放 | 蜜桃视频一区二区三区| 麻豆三级在线观看| 久久福利资源站| 91热视频在线观看| 国产精品一级在线| 亚洲成人福利视频| 99精品国产热久久91蜜凸| 波多野结衣福利| 国产欧美综合在线| 三级黄色片在线观看| 亚洲天堂av老司机| 麻豆视频在线观看| 精品久久久中文| 国产精品suv一区| 欧美天天综合网| 国产又爽又黄免费软件| 3d成人h动漫网站入口| 国产chinasex对白videos麻豆| 这里只有精品99re| 懂色av一区二区三区四区| 亚洲精品久久久久久下一站 | 在线观看国产成人| 在线不卡的av| 性做久久久久久久久久| 亚洲精品国产精品自产a区红杏吧| 九色在线免费| 久久精品美女视频网站| 波多野结衣乳巨码无在线观看| 26uuu日韩精品一区二区| 久久精品国产福利| 97人人模人人爽视频一区二区| 欧美人与动xxxxz0oz| 亚洲视频欧美在线| 黄色亚洲精品| 亚洲男人天堂色| 国产成人一级电影| 欧美亚一区二区三区| 国产精品久久精品日日| 国产香蕉在线视频| 欧美午夜宅男影院| 国模无码一区二区三区| 国产一区二区精品丝袜| 欧美性video| 国产精品专区一| 国产乱人伦精品一区| 亚洲精品成人久久久998| 国产专区一区| mm131亚洲精品| 99久久精品免费| 成人涩涩小片视频日本| 欧美日韩亚洲天堂| 国内毛片毛片毛片毛片| 国产亚洲成av人片在线观看桃| 26uuu亚洲电影在线观看| 日韩免费在线视频| 伊人久久大香线蕉av超碰| 日本亚洲导航| 精品999网站| 中日韩av在线播放| 91视频.com| 久久精品欧美一区二区| 欧美色图在线观看| 青青草在线免费视频| 九九热在线精品视频| 国产精品亲子伦av一区二区三区| 国产女主播一区二区三区| 婷婷久久国产对白刺激五月99| 国产亚洲天堂网| 大美女一区二区三区| 国产尤物在线播放| 欧美亚洲日本国产| 日本又骚又刺激的视频在线观看| 欧美激情小视频| 91精品福利观看| 亚洲春色在线视频| 久久都是精品| 成人性生活免费看| 亚洲激情图片一区| 国产强伦人妻毛片| 久久久精品电影| 久久91视频| 亚洲精蜜桃久在线| 日本sm残虐另类| 四虎影成人精品a片| 欧美视频免费在线观看| 日韩一级在线播放| 国内外成人免费激情在线视频网站| 96sao精品免费视频观看| 色一情一乱一伦一区二区三区丨 | www.色.com| 亚洲欧美视频在线观看| 在线免费av网| www.xxxx精品| 国产视频一区二区在线播放| 尤物一区二区三区| 国产在线视视频有精品| 黄色香蕉视频在线观看| 欧美一级日韩不卡播放免费| 岛国成人毛片| 成人精品一二区| 精品福利av| 韩国无码一区二区三区精品| 欧美日韩免费看| 国产综合视频一区二区三区免费| 国产97在线观看| 成人在线免费观看91| 日本中文字幕影院| 亚洲另类在线制服丝袜| 蜜臀av午夜精品| 欧美诱惑福利视频| 精品国产91乱码一区二区三区四区 | 久久久久国产精品视频| 媚黑女一区二区| 五月天免费网站| 日韩精品一区二区三区蜜臀| 成人在线黄色电影| 日本婷婷久久久久久久久一区二区| 美女视频免费一区| 日韩女优一区二区| 亚洲第一男人天堂| 欧美成人精品三级网站| 精品久久免费观看| 国产成人av一区二区三区在线| 国产一级片久久| 亚洲欧美制服丝袜| 高清国产一区二区三区四区五区| 99re8这里只有精品| 成人va在线观看| 小泽玛利亚一区二区三区视频| 日韩中文av在线| 一区二区日韩| 不卡影院一区二区| 亚洲三级视频在线观看| 天堂在线资源库| 国产精品日韩在线| 欧美69wwwcom| 欧美激情aaa| 日韩一区二区免费视频| 在线视频超级| a级黄色片网站| 2022国产精品视频| 国产精品免费无遮挡| 91精品国产高清久久久久久| 成人在线一区| 欧美在线一级片| 91精品国产综合久久蜜臀 | 舔着乳尖日韩一区| 巨大荫蒂视频欧美另类大| 免费日韩av电影| 国产+成+人+亚洲欧洲自线|