這段代碼要看懂不難,因此我提一個(gè)簡(jiǎn)單問題,以下這個(gè) JSON 命中哪個(gè)分支:
{ "result": "ok", "command": "message", "content": { "from": "CatChen", "content": "Hello!" } }
你很容易就能得到正確答案:這個(gè) JSON 命中 /* render chat message */ (顯示聊天消息)這個(gè)分支。那么我想了解一下,你是如何作出這個(gè)判斷的?首先,你要看它是否命中 case “ok”: 分支,結(jié)果是命中了;然后,你要看它是否命中 case “message”: 分支,結(jié)果也是命中了,所以 case “systemmessage”: 就不用看了;接下來,它不命中 if 里面的條件;并且,它也不命中 else if 里面的條件,所以它命中了 else 這個(gè)分支。
看出問題來了嗎?為什么你不能看著這個(gè) else 就說出這個(gè) JSON 命中這個(gè)分支?因?yàn)?else 本身不包含任何條件,它只隱含條件!每一個(gè) else 的條件,都是對(duì)它之前的每一個(gè) if 和 else if 進(jìn)行先非后與運(yùn)算的結(jié)果。也就是說,判斷命中這個(gè) else ,相當(dāng)于判斷命中這樣一組復(fù)雜的條件:
!(json.content.from == "" && json.content.content == "kicked") && !(json.command == "systemmessage" || json.content.type == "sysmsg")
再套上外層的兩個(gè) switch case ,這個(gè)分支的條件就是這樣子的:
json.result == "ok" && (json.command == "message" || json.command == "systemmessage") && !(json.content.from == "" && json.content.content == "kicked") && !(json.command == "systemmessage" || json.content.type == "sysmsg")
這里面有重復(fù)邏輯,省略后是這樣子的:
json.result == "ok" && json.command == "message" && !(json.content.from == "" && json.content.content == "kicked") && !(json.content.type == "sysmsg")
我們花了多大力氣才從簡(jiǎn)簡(jiǎn)單單的 else 這四個(gè)字母中推導(dǎo)出這樣一長(zhǎng)串邏輯運(yùn)算表達(dá)式來?況且,不仔細(xì)看還真的看不懂這個(gè)表達(dá)式說的是什么。
這就是復(fù)雜分支難以閱讀和管理的地方。想象你面對(duì)一個(gè) switch case 套一個(gè) if else ,總共有3個(gè) case ,每個(gè) case 里面有3個(gè) else ,這就夠你研究的了──每一個(gè)分支,條件中都隱含著它所有前置分支以及所有祖先分支的前置分支先非后與的結(jié)果。
如何避免復(fù)雜分支
首先,復(fù)雜邏輯運(yùn)算是不能避免的。重構(gòu)得到的結(jié)果應(yīng)該是等價(jià)的邏輯,我們能做的只是讓代碼變得更加容易閱讀和管理。因此,我們的重點(diǎn)應(yīng)該在于如何使得復(fù)雜邏輯運(yùn)算變得易于閱讀和管理。
出處:百度泛用戶體驗(yàn)
責(zé)任編輯:bluehearts
上一頁 從if else到switch case再到抽象 [1] 下一頁 從if else到switch case再到抽象 [3]
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評(píng)論。
|