国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

活用設(shè)計(jì)模式:如何避免一連串的if else

yanbingyun1990 / 2548人閱讀

摘要:對(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

相關(guān)文章

  • JavaScript代碼風(fēng)格要素

    摘要:刪除不必要的代碼。而簡(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...

    YPHP 評(píng)論0 收藏0
  • 我們不背誦 API,只實(shí)現(xiàn) API

    摘要:接下來,我們換一種思路,用一個(gè)相對(duì)較新的來實(shí)現(xiàn)方法。從這道題目看出,相比考察死記硬背,這樣的實(shí)現(xiàn)更有意義。對(duì)數(shù)組的操作我們不能陌生,其中方法更要做到駕輕就熟。最后,我們?cè)倏聪律鐓^(qū)上著名的和的實(shí)現(xiàn)。 有不少剛?cè)胄械耐瑢W(xué)跟我說:JavaScript 很多 API 記不清楚怎么辦?數(shù)組的這方法、那方法總是傻傻分不清楚,該如何是好?操作 DOM 的方式今天記,明天忘,真讓人奔潰! 甚至有的開發(fā)...

    wudengzan 評(píng)論0 收藏0
  • 我們不背誦 API,只實(shí)現(xiàn) API

    摘要:接下來,我們換一種思路,用一個(gè)相對(duì)較新的來實(shí)現(xiàn)方法。從這道題目看出,相比考察死記硬背,這樣的實(shí)現(xiàn)更有意義。對(duì)數(shù)組的操作我們不能陌生,其中方法更要做到駕輕就熟。最后,我們?cè)倏聪律鐓^(qū)上著名的和的實(shí)現(xiàn)。 有不少剛?cè)胄械耐瑢W(xué)跟我說:JavaScript 很多 API 記不清楚怎么辦?數(shù)組的這方法、那方法總是傻傻分不清楚,該如何是好?操作 DOM 的方式今天記,明天忘,真讓人奔潰! 甚至有的開發(fā)...

    wayneli 評(píng)論0 收藏0
  • JS 活學(xué)活用正則表達(dá)式

    摘要:記錄一些項(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 去除...

    CntChen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<