亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

yanbingyun1990 / 2621人閱讀

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

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

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

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

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

因為他用Python,我就回答:把每一個條件判斷都寫成一個布爾函數(shù),把這些函數(shù)依次放進(jìn)一個數(shù)組/列表。再寫一個函數(shù)來遍歷數(shù)組,對每一項,若為假則返回,若為真則繼續(xù)。

對Java(8之前)來說,沒有一等函數(shù),就要把每個條件判斷寫成Function接口的實現(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是個包裝類,包含了gun, city, bird, tree等數(shù)據(jù)。

折騰之后,代碼量相比一連串if else略有減少,似乎收益不大?噢,值得注意的是,這種方法具有高度的靈活性!

這些條件可以提前定義好,然后到處復(fù)用!你可以任意地組合它們,來構(gòu)造一段業(yè)務(wù)邏輯,只需要挑選你要的條件,塞到一個list里面!簡直棒!

這是用了哪種設(shè)計模式呢,比較像Strategy,我認(rèn)為還像Template Method: 定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。
我們定義了作為骨架的judge():for循環(huán),遇到false中止。然后在把步驟在子類中實現(xiàn)(雖然與judge()不屬于同一個父類)。
雖然結(jié)構(gòu)跟書上不一樣,但是有相同的精神。

Chain of Responsibility需要前后鏈接,節(jié)點對其后的子鏈有控制力,所以不那么像。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/64141.html

相關(guān)文章

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

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

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

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

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

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

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

    摘要:記錄一些項目中用到的正則工具,將持續(xù)更新如果對中的正則不太了解,可以參考一下中正則表達(dá)式必知必會字符串操作去除字符串兩邊的空格編碼對等字符轉(zhuǎn)義,避免攻擊找出重復(fù)最多的字符把字符串轉(zhuǎn)換為數(shù)組首先進(jìn)行排序,這樣結(jié)果會把相同的字符放在一起,然后再 記錄一些項目中用到的正則工具,將持續(xù)更新... 如果對JS中的正則不太了解,可以參考一下JS 中正則表達(dá)式必知必會 1. 字符串操作 1.1 去除...

    CntChen 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<