成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

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

yanbingyun1990 / 2607人閱讀

摘要:對(duì)之前來(lái)說(shuō),沒(méi)有一等函數(shù),就要把每個(gè)條件判斷寫成接口的實(shí)現(xiàn)類。需要前后鏈接,節(jié)點(diǎn)對(duì)其后的子鏈有控制力,所以不那么像。

另載于 http://www.qingjingjie.com/blogs/8

前段時(shí)間知乎上有人發(fā)了這么個(gè)段子:

某日,老師在課堂上想考考學(xué)生們的智商,就問(wèn)一個(gè)男孩: “樹(shù)上有十只鳥(niǎo),開(kāi)槍打死一只,還剩幾只?” 
男孩反問(wèn):“是無(wú)聲手槍,還是其他沒(méi)有聲音的槍么?” 
“不是.” 
“槍聲有多大?” 
“80~100分貝.” 
“那就是說(shuō)會(huì)震的耳朵疼?” 
“是.” 
“在這個(gè)城市里打鳥(niǎo)犯不犯法?” 
‘不犯.” 
“您確定那只鳥(niǎo)真的被打死啦?” 
“確定.”老師已經(jīng)不耐煩了,”拜托,你告訴我還剩幾只就行了,OK?” 
“OK.鳥(niǎo)里有沒(méi)有聾子?” 
“沒(méi)有.” 
“有沒(méi)有鳥(niǎo)智力有問(wèn)題,呆傻到聽(tīng)到槍響不知道飛的?” 
“沒(méi)有,智商都在200以上!” 
“有沒(méi)有關(guān)在籠子里的?” 
“沒(méi)有.” 
“邊上還有沒(méi)有其他的樹(shù),樹(shù)上還有沒(méi)有其他鳥(niǎo)?” 
“沒(méi)有.” “方圓十里呢?” “就這么一棵樹(shù)!” 
“有沒(méi)有殘疾或餓的飛不動(dòng)的鳥(niǎo)?” 
“沒(méi)有,都身體倍棒.” 
“算不算懷孕肚子里的小鳥(niǎo)?” 
“都是公的.” 
“都不可能懷孕?” 
“………,決不可能.” 
“打鳥(niǎo)的人眼里有沒(méi)有花?保證是十只?” 
“沒(méi)有花,就十只.” 老師腦門上的汗已經(jīng)流下來(lái)了, 
下課鈴響起,但男孩仍繼續(xù)問(wèn):“有沒(méi)有傻的不怕死的?” 
“都怕死.” 
“有沒(méi)有因?yàn)榍閭H被打中,自己留下來(lái)的?” 
“笨蛋,之前不是說(shuō)都是公的嘛!” 
“**可不可以啊!” 
“………….,性取向都很正常!” 
“會(huì)不會(huì)一槍打死兩只?” 
“不會(huì).” 
“一槍打死三只呢?” 
“不會(huì).” 
“四只呢?” 
“更不會(huì)!” 
“五只呢?” 
“絕對(duì)不會(huì)!!!” 
“那六只總有可能吧?” 
“除非你他媽的是豬生的才有可能!一槍只能打死一只!” 
“…好吧,那么所有的鳥(niǎo)都可以自由活動(dòng)么?” 
“完全可以.” 
“它們受到驚嚇起飛時(shí)會(huì)不會(huì)驚慌失措而互相撞上?” 
“不會(huì),每只鳥(niǎo)都裝有衛(wèi)星導(dǎo)航系統(tǒng),而且可以自動(dòng)飛行.” 
“恩,如果您的回答沒(méi)有騙人,”學(xué)生滿懷信心的回答,“打死的鳥(niǎo)要是掛在樹(shù)上沒(méi)掉下來(lái),那么就剩一只,如果掉下來(lái),就一只不剩.” 
老師推推眼鏡,強(qiáng)忍著要昏倒的感覺(jué),顫抖地說(shuō)道:“你可以去當(dāng)程序員了……”

有人就在下面問(wèn)怎么寫代碼才能避免一連串的if else?

因?yàn)樗肞ython,我就回答:把每一個(gè)條件判斷都寫成一個(gè)布爾函數(shù),把這些函數(shù)依次放進(jìn)一個(gè)數(shù)組/列表。再寫一個(gè)函數(shù)來(lái)遍歷數(shù)組,對(duì)每一項(xiàng),若為假則返回,若為真則繼續(xù)。

對(duì)Java(8之前)來(lái)說(shuō),沒(méi)有一等函數(shù),就要把每個(gè)條件判斷寫成Function接口的實(shí)現(xiàn)類。

而用Java 8來(lái)寫,就是:

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ù)用!你可以任意地組合它們,來(lái)構(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://m.hztianpu.com/yun/64141.html

相關(guān)文章

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

    摘要:刪除不必要的代碼。而簡(jiǎn)化前的代碼包含的語(yǔ)法要素對(duì)于傳達(dá)代碼意義本身作用并不大。刪除不必要的代碼有時(shí)候,我們?cè)噲D為不必要的事物命名。例如,大多數(shù)情況下,你應(yīng)該省略僅僅用來(lái)當(dāng)做返回值的變量。你的函數(shù)名應(yīng)該已經(jīng)說(shuō)明了關(guān)于函數(shù)返回值的信息。 原文地址 本文已在前端早讀課公眾號(hào)首發(fā):【第952期】JavaScript代碼風(fēng)格要素 譯者:墨白 校對(duì):野草 1920年,由威廉·斯特倫克(Will...

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

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

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

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

閱讀需要支付1元查看
<