摘要:對(duì)之前來說,沒有一等函數(shù),就要把每個(gè)條件判斷寫成接口的實(shí)現(xiàn)類。需要前后鏈接,節(jié)點(diǎn)對(duì)其后的子鏈有控制力,所以不那么像。
另載于 http://www.qingjingjie.com/blogs/8
前段時(shí)間知乎上有人發(fā)了這么個(gè)段子:
某日,老師在課堂上想考考學(xué)生們的智商,就問一個(gè)男孩: “樹上有十只鳥,開槍打死一只,還剩幾只?” 男孩反問:“是無聲手槍,還是其他沒有聲音的槍么?” “不是.” “槍聲有多大?” “80~100分貝.” “那就是說會(huì)震的耳朵疼?” “是.” “在這個(gè)城市里打鳥犯不犯法?” ‘不犯.” “您確定那只鳥真的被打死啦?” “確定.”老師已經(jīng)不耐煩了,”拜托,你告訴我還剩幾只就行了,OK?” “OK.鳥里有沒有聾子?” “沒有.” “有沒有鳥智力有問題,呆傻到聽到槍響不知道飛的?” “沒有,智商都在200以上!” “有沒有關(guān)在籠子里的?” “沒有.” “邊上還有沒有其他的樹,樹上還有沒有其他鳥?” “沒有.” “方圓十里呢?” “就這么一棵樹!” “有沒有殘疾或餓的飛不動(dòng)的鳥?” “沒有,都身體倍棒.” “算不算懷孕肚子里的小鳥?” “都是公的.” “都不可能懷孕?” “………,決不可能.” “打鳥的人眼里有沒有花?保證是十只?” “沒有花,就十只.” 老師腦門上的汗已經(jīng)流下來了, 下課鈴響起,但男孩仍繼續(xù)問:“有沒有傻的不怕死的?” “都怕死.” “有沒有因?yàn)榍閭H被打中,自己留下來的?” “笨蛋,之前不是說都是公的嘛!” “**可不可以啊!” “………….,性取向都很正常!” “會(huì)不會(huì)一槍打死兩只?” “不會(huì).” “一槍打死三只呢?” “不會(huì).” “四只呢?” “更不會(huì)!” “五只呢?” “絕對(duì)不會(huì)!!!” “那六只總有可能吧?” “除非你他媽的是豬生的才有可能!一槍只能打死一只!” “…好吧,那么所有的鳥都可以自由活動(dòng)么?” “完全可以.” “它們受到驚嚇起飛時(shí)會(huì)不會(huì)驚慌失措而互相撞上?” “不會(huì),每只鳥都裝有衛(wèi)星導(dǎo)航系統(tǒng),而且可以自動(dòng)飛行.” “恩,如果您的回答沒有騙人,”學(xué)生滿懷信心的回答,“打死的鳥要是掛在樹上沒掉下來,那么就剩一只,如果掉下來,就一只不剩.” 老師推推眼鏡,強(qiáng)忍著要昏倒的感覺,顫抖地說道:“你可以去當(dāng)程序員了……”
有人就在下面問怎么寫代碼才能避免一連串的if else?
因?yàn)樗肞ython,我就回答:把每一個(gè)條件判斷都寫成一個(gè)布爾函數(shù),把這些函數(shù)依次放進(jìn)一個(gè)數(shù)組/列表。再寫一個(gè)函數(shù)來遍歷數(shù)組,對(duì)每一項(xiàng),若為假則返回,若為真則繼續(xù)。
對(duì)Java(8之前)來說,沒有一等函數(shù),就要把每個(gè)條件判斷寫成Function接口的實(shí)現(xiàn)類。
而用Java 8來寫,就是:
Collection> conditions = new ArrayList<>(); conditions.add(context -> isGunSilent(context)); conditions.add(context -> isGunSoundBig(context)); conditions.add(context -> isShootingBirdLegal(context)); ... public boolean judge(Context context, Collection > conditions) { for (Function cond : conditions) { if (!cond.apply(context)) { return false; } } return true; }
Context是個(gè)包裝類,包含了gun, city, bird, tree等數(shù)據(jù)。
折騰之后,代碼量相比一連串if else略有減少,似乎收益不大?噢,值得注意的是,這種方法具有高度的靈活性!
這些條件可以提前定義好,然后到處復(fù)用!你可以任意地組合它們,來構(gòu)造一段業(yè)務(wù)邏輯,只需要挑選你要的條件,塞到一個(gè)list里面!簡(jiǎn)直棒!
這是用了哪種設(shè)計(jì)模式呢,比較像Strategy,我認(rèn)為還像Template Method: 定義一個(gè)操作中的算法的骨架,而將一些步驟延遲到子類中。
我們定義了作為骨架的judge():for循環(huán),遇到false中止。然后在把步驟在子類中實(shí)現(xiàn)(雖然與judge()不屬于同一個(gè)父類)。
雖然結(jié)構(gòu)跟書上不一樣,但是有相同的精神。
Chain of Responsibility需要前后鏈接,節(jié)點(diǎn)對(duì)其后的子鏈有控制力,所以不那么像。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/64141.html
摘要:刪除不必要的代碼。而簡(jiǎn)化前的代碼包含的語法要素對(duì)于傳達(dá)代碼意義本身作用并不大。刪除不必要的代碼有時(shí)候,我們?cè)噲D為不必要的事物命名。例如,大多數(shù)情況下,你應(yīng)該省略僅僅用來當(dāng)做返回值的變量。你的函數(shù)名應(yīng)該已經(jīng)說明了關(guān)于函數(shù)返回值的信息。 原文地址 本文已在前端早讀課公眾號(hào)首發(fā):【第952期】JavaScript代碼風(fēng)格要素 譯者:墨白 校對(duì):野草 1920年,由威廉·斯特倫克(Will...
摘要:接下來,我們換一種思路,用一個(gè)相對(duì)較新的來實(shí)現(xiàn)方法。從這道題目看出,相比考察死記硬背,這樣的實(shí)現(xiàn)更有意義。對(duì)數(shù)組的操作我們不能陌生,其中方法更要做到駕輕就熟。最后,我們?cè)倏聪律鐓^(qū)上著名的和的實(shí)現(xiàn)。 有不少剛?cè)胄械耐瑢W(xué)跟我說:JavaScript 很多 API 記不清楚怎么辦?數(shù)組的這方法、那方法總是傻傻分不清楚,該如何是好?操作 DOM 的方式今天記,明天忘,真讓人奔潰! 甚至有的開發(fā)...
摘要:接下來,我們換一種思路,用一個(gè)相對(duì)較新的來實(shí)現(xiàn)方法。從這道題目看出,相比考察死記硬背,這樣的實(shí)現(xiàn)更有意義。對(duì)數(shù)組的操作我們不能陌生,其中方法更要做到駕輕就熟。最后,我們?cè)倏聪律鐓^(qū)上著名的和的實(shí)現(xiàn)。 有不少剛?cè)胄械耐瑢W(xué)跟我說:JavaScript 很多 API 記不清楚怎么辦?數(shù)組的這方法、那方法總是傻傻分不清楚,該如何是好?操作 DOM 的方式今天記,明天忘,真讓人奔潰! 甚至有的開發(fā)...
摘要:記錄一些項(xiàng)目中用到的正則工具,將持續(xù)更新如果對(duì)中的正則不太了解,可以參考一下中正則表達(dá)式必知必會(huì)字符串操作去除字符串兩邊的空格編碼對(duì)等字符轉(zhuǎn)義,避免攻擊找出重復(fù)最多的字符把字符串轉(zhuǎn)換為數(shù)組首先進(jìn)行排序,這樣結(jié)果會(huì)把相同的字符放在一起,然后再 記錄一些項(xiàng)目中用到的正則工具,將持續(xù)更新... 如果對(duì)JS中的正則不太了解,可以參考一下JS 中正則表達(dá)式必知必會(huì) 1. 字符串操作 1.1 去除...
閱讀 2792·2021-09-01 10:30
閱讀 1686·2019-08-30 15:52
閱讀 973·2019-08-29 18:40
閱讀 1129·2019-08-28 18:30
閱讀 2399·2019-08-23 17:19
閱讀 1330·2019-08-23 16:25
閱讀 2703·2019-08-23 16:18
閱讀 2983·2019-08-23 13:53