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

国产日本久久| 亚洲精品97久久中文字幕| 亚洲影院天堂中文av色| 在线观看亚洲精品| 一区二区三区四区在线视频| 国产精品特级毛片一区二区三区| 国产一区美女| 国产亚洲精品美女| 日韩精品视频网址| 自由日本语热亚洲人| 中文字幕在线一区二区三区| 国产富婆一区二区三区| www.com亚洲| 欧美日韩ab| 亚洲欧美另类国产| 天天久久综合网| 亚洲v.com| 亚洲欧美日本在线| 免费h精品视频在线播放| 国产一区二区小视频| 亚洲麻豆视频| 久久视频免费在线播放| 特级西西人体wwwww| 欧美在线一级| 91精品福利在线| 亚洲精品蜜桃久久久久久| 成人av毛片| gogogo免费视频观看亚洲一| 成人国产精品一区二区| 一级片在线观看免费| 欧美精品97| 久久精品国产91精品亚洲| 国产全是老熟女太爽了| xxxxxhd亚洲人hd| 欧美日韩三级视频| 女性隐私黄www网站视频| 免费网站在线观看人| 国产精品欧美极品| 欧美日本韩国一区二区三区| 亚洲国产欧美另类| 国产一区日韩二区欧美三区| 国产精品女人久久久久久| 欧美一区二区三区四| 黄色免费成人| 欧美日本在线视频中文字字幕| 国产极品视频在线观看| 国产精品一国产精品| 日韩精品福利网站| 中文字幕在线视频播放| 91嫩草精品| 日韩美一区二区三区| 国产乱码一区二区三区四区| 久久精品资源| 欧美日韩在线观看一区二区 | 亚洲在线一区二区三区| 熟妇熟女乱妇乱女网站| 日本免费在线视频| 国产精品成人免费精品自在线观看 | 亚洲欧美综合另类中字| 在线观看日韩精品视频| 亚洲区小说区图片区qvod按摩 | 无码国产69精品久久久久网站| 久久九九精品视频| 91精品国产综合久久精品| 欧美成人手机在线视频| 国产一区二区三区| 欧美一区二区三区免费视频| 国内av免费观看| 日韩三级网址| 亚洲第一免费播放区| 182在线视频| 蜜桃成人av| 午夜国产福利在线| 国产性做久久久久久| 日本一区二区精品| 午夜免费视频在线国产| 亚洲欧洲成人自拍| 国产1区2区3区中文字幕| 免费男女羞羞的视频网站在线观看| 亚洲精品高清在线| 日韩精品 欧美| 欧美极度另类| 欧美日韩三级一区| 黄色片子免费看| 美女一区2区| 亚洲最新av在线| 成熟的女同志hd| 亚洲国产美女 | 欧美在线视频二区| 亚乱亚乱亚洲乱妇| 亚洲在线观看免费| 久久久精品在线视频| 国产第一精品| 精品国内片67194| 精品人伦一区二区三电影| 日韩精品电影| 97视频在线播放| 中文字幕人妻一区二区三区视频| 狠狠色丁香婷综合久久| 精品一区在线播放| 91吃瓜网在线观看| 午夜不卡在线视频| 特黄视频免费观看| 久久久久高潮毛片免费全部播放| 亚洲最新视频在线| 久久久久久久久久久网| 日韩经典中文字幕一区| 97久久夜色精品国产九色| 色资源在线观看| 亚洲精品高清在线| 99热手机在线| 九九热播视频在线精品6| 中文字幕精品网| 日本少妇裸体做爰| 极品美女销魂一区二区三区 | 九色视频在线观看免费播放| 综合久久一区二区三区| 黄色片久久久久| 成午夜精品一区二区三区软件| 中文字幕久久久av一区| 国产特黄大片aaaa毛片| 国产麻豆精品在线| 亚洲精品成人自拍| 韩国美女久久| 亚洲福利在线播放| 国产suv一区二区三区| 视频一区二区国产| 激情五月综合色婷婷一区二区| 免费大片在线观看www| 日韩欧美视频一区二区三区| 亚洲欧美激情一区二区三区| 97精品国产一区二区三区| 欧美在线性爱视频| 蜜桃91麻豆精品一二三区| 综合色中文字幕| 91在线视频观看免费| 欧美调教网站| 国内精品在线一区| 精品久久在线观看| 亚洲欧洲国产日韩| 想看黄色一级片| 久久人体视频| 国产精品爽黄69天堂a| 国产福利在线| 91九色最新地址| 亚洲v国产v欧美v久久久久久| 一区二区高清| 国内精品视频免费| 7777kkk亚洲综合欧美网站| 日韩欧美国产小视频| 国产盗摄一区二区三区在线| 国产麻豆精品视频| 久久久久久久久影视| 国产日本亚洲| 欧美成人手机在线| 亚洲黄色小说网址| 午夜久久久久久| 男男一级淫片免费播放| 日韩香蕉视频| 久久婷婷国产综合尤物精品| 成人勉费视频| 一本久久综合亚洲鲁鲁| 欧美性受xxx黑人xyx性爽| 欧美国产97人人爽人人喊| a在线观看免费视频| 久久国产成人午夜av影院宅| 国产一区二区色| caoporm免费视频在线| 欧美一个色资源| 久操免费在线视频| av一区二区三区四区| 无码人妻丰满熟妇区96| 久久成人高清| 国产在线精品成人一区二区三区| 成人免费网站在线观看视频| 精品国产污网站| 精品人妻无码一区二区性色| 国产欧美一区二区三区在线看蜜臀 | 国产精品乱码| 中文日产幕无线码一区二区| 在线看国产精品| 国产熟女一区二区三区五月婷| 亚洲午夜电影网| 日韩av一二区| 国产一区视频网站| 激情五月宗合网| 成人一区二区| 99超碰麻豆| 亚洲播播91| 久久精品电影网| 天天操天天舔天天干| 欧美中文一区二区三区| 麻豆明星ai换脸视频| 2023国产精品视频| 亚洲日本黄色片| 国产日韩高清一区二区三区在线| 丝袜足脚交91精品| 国产精品丝袜在线播放| 国产精品v片在线观看不卡| 八戒八戒神马在线电影| 精品视频久久久久久| 在线观看亚洲国产| 五月天亚洲精品| 神马午夜精品91| 26uuu亚洲| 制服.丝袜.亚洲.中文.综合懂 | 一道本在线免费视频| 亚洲视频中文| 中文字幕精品一区日韩| 亚洲精品一级二级三级| 99re国产| 电影在线观看一区二区| 国外成人在线播放| 麻豆视频在线免费观看| 亚洲色图综合久久| 女人18毛片一区二区三区| 欧美日韩卡一卡二| 天堂在线免费观看视频| 亚洲黄色片在线观看| 蜜桃av免费在线观看| 26uuu亚洲| 久久久久成人精品无码中文字幕| 精一区二区三区| 欧美私人情侣网站| 日韩午夜一区| 国产美女主播在线| 亚洲精品成人| 一区二区高清视频| 国内黄色精品| 国产亚洲欧美一区二区| 日韩一二三区| 91精品视频在线看| 久久久精品一区二区毛片免费看| 欧美在线一区二区视频| 55av亚洲| 992tv成人免费影院| 色呦呦在线免费观看| 日韩色av导航| 色综合久久影院| 国产一区二区三区在线视频| 神马亚洲视频| 日韩精品极品视频| 日本人妖在线| 日韩大片免费观看视频播放| 欧美一区二不卡视频| 精品欧美久久久| 好男人www在线视频| 日韩三级视频在线看| 国产视频一区二区三区四区五区| 欧美日本一区二区三区四区| 亚洲中文无码av在线| 欧美亚洲精品一区| 在线免费一级片| 欧美日韩国产色站一区二区三区| 中文字幕乱码人妻无码久久| 欧美偷拍一区二区| 亚洲天堂网视频| 在线成人免费观看| 国产欧美一区二区三区视频在线观看| 欧美日韩一卡二卡| 国产精品系列视频| 日韩免费性生活视频播放| 国产后入清纯学生妹| 日韩一级完整毛片| 精品人妻少妇AV无码专区| 亚洲精品一区二区在线观看| 四虎精品成人免费网站| 亚洲网站在线播放| 久草中文在线观看| 欧美激情精品久久久久久免费印度 | 国产农村妇女毛片精品久久麻豆| 91大神福利视频| 亚洲美女在线国产| 五月天综合在线| 精品久久久久久久久久国产| 尤物视频免费观看| 欧美日韩高清一区二区三区| va视频在线观看| 亚洲韩国日本中文字幕| 韩日在线视频| 麻豆乱码国产一区二区三区| 欧美黑人猛交的在线视频| 97色在线观看免费视频| 国产另类xxxxhd高清| 91网站在线看| 首页亚洲中字| 在线一区日本视频| 亚洲福利专区| 国产又大又黄又猛| 福利视频网站一区二区三区| 久久久久麻豆v国产精华液好用吗 在线观看国产免费视频 | 日韩欧美不卡| 丁香婷婷综合激情| 秋霞影院一区二区| 中文字幕人妻熟女在线| 国产嫩草影院久久久久| 免费一级肉体全黄毛片| 日本韩国一区二区| 国产xxxx孕妇| 亚洲欧美成人一区二区在线电影| 国产成人在线视频免费观看| 2018日韩中文字幕| 久久丁香四色| 日韩激情久久| 亚洲国产二区| 亚洲天堂一区二区在线观看| 91免费观看视频在线| 欧美精品久久久久久久久46p| 疯狂做受xxxx高潮欧美日本| 国产精品无码白浆高潮| 亚洲欧美国产va在线影院| 91精品国产91久久久久久青草| 日本91av在线播放| 亚洲五码在线| 欧美一区二区三区在线播放| 狠狠干成人综合网| 午夜啪啪小视频| 成人福利在线看| 91人妻一区二区三区蜜臀| 色94色欧美sute亚洲线路二 | 国产精品白丝av| 国产三级在线观看完整版| 亚洲综合丁香婷婷六月香| 影音先锋国产资源| 国产一区二区三区在线视频 | 亚洲成av人**亚洲成av**| 国产又粗又猛视频免费| 亚洲欧美在线一区| 国产在线精彩视频| 国产一区二区不卡视频在线观看 | 按摩亚洲人久久| 成人在线视频免费看| 欧美日韩在线观看一区| 日韩一区二区久久| 成熟妇人a片免费看网站| 亚洲精品国产精华液| 国产一区二区三区在线观看| 中文字幕日韩精品有码视频| 成人免费福利| 日韩一区不卡| 日日夜夜精品视频免费| 四虎影成人精品a片| 欧美视频在线观看免费| 日韩大胆人体| 日韩免费在线播放| 久久99影视| 日本va中文字幕| 国产视频911| 老熟妇一区二区三区| 亚洲视频网站在线观看| 成人免费网站www网站高清| 日本欧美色综合网站免费| 久久动漫亚洲| 国产精品国产三级国产专业不| 色综合天天综合在线视频| 国产小视频免费在线观看| 国产精品wwwwww| 99精品网站| 男人操女人下面视频| 亚洲精品老司机| 国 产 黄 色 大 片| 97久久精品人搡人人玩| 国产成人高清| 亚洲一区在线不卡| 亚洲欧美综合在线精品| 精品久久久免费视频| 欧美精品videosex极品1| 久久中文资源| 欧美午夜性生活| 国产精品嫩草影院av蜜臀| 国产尤物视频在线观看| 欧美日韩xxx| 色老板在线视频一区二区| 99草草国产熟女视频在线| 亚洲欧洲av色图| 成人免费一级视频| 国产精欧美一区二区三区| 欧美电影免费播放| 老熟女高潮一区二区三区| 精品久久久久久久久国产字幕| 大乳在线免费观看| 92国产精品视频| 99伊人成综合| av免费播放网站| 欧美不卡一区二区三区| 亚洲美女炮图| 久久av喷吹av高潮av| 不卡的av在线| 中文字幕在线视频第一页| 色综合色综合网色综合| 视频国产一区| wwwww在线观看| 在线视频综合导航| 视频在线观看入口黄最新永久免费国产 | 久久久久久久久久一级| 欧美成年人网站| 性人久久久久| 一起草最新网址| 日本精品免费观看高清观看| 永久免费网站在线|