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

資訊專欄INFORMATION COLUMN

javascript 參數(shù)檢驗(yàn)(二):參數(shù)檢查工具的完善

cheukyin / 1960人閱讀

摘要:上一個版本的問題接這篇文章,聊聊參數(shù)檢查工具的完善。最終實(shí)現(xiàn)了這樣的效果檢查是否在區(qū)間與的交集內(nèi)檢查是否在區(qū)間與的并集內(nèi)檢查是否是數(shù)組并且長度大于檢查是否不是之間的偶數(shù)即

上一個版本的問題

接這篇文章,聊聊參數(shù)檢查工具 param-check 的完善。

按照之前的接口設(shè)計(jì),鏈?zhǔn)秸{(diào)用表示“與”,參數(shù)表表示“或”,自然產(chǎn)生了一個問題——如果我要表達(dá)“(A與B)或(C與D)”這樣的邏輯組合應(yīng)該怎么辦?

以及,由于 not 調(diào)用只對它后面的第一個調(diào)用生效,那么如果我要實(shí)現(xiàn)“非(A與B)”,該怎么辦?

總結(jié)起來,實(shí)際上就是給邏輯表達(dá)式加括號的問題。

or 和 and 方法

為了自由表達(dá)與或關(guān)系,我們需要擴(kuò)展一下規(guī)則。分析可知,函數(shù)調(diào)用的參數(shù)表是一個天然的括號,所以只用來表達(dá)“或”太奢侈了。我們添加方法 or 和 and,使之能表達(dá)與和或。但是這里有個問題,param-check 目前的接口都是即時計(jì)算的,如果你把調(diào)用串當(dāng)做參數(shù)傳遞,沒有傳進(jìn)去之前已經(jīng)計(jì)算完了,異常捕獲不到,沒法實(shí)現(xiàn)邏輯關(guān)系。比如:

check(a).or(check(a).gt(1).lt(3), check(a).gt(2).lt(4));

上面的代碼是沒法實(shí)現(xiàn) or 的。

解決方法比較容易想到的有兩個:

改變接口模式,不再拋出異常,二是返回 false。這樣 or 和 and 就很容易實(shí)現(xiàn)了,但是鏈?zhǔn)秸{(diào)用就沒法實(shí)現(xiàn)了。

提取 check 的調(diào)用路徑,使得一個檢查過程能保存在一個對象(高階函數(shù))里,當(dāng)做參數(shù)傳到其它函數(shù)中,本質(zhì)上這是一種函數(shù)式編程方法。如果不考慮到書寫方便,這是很容易實(shí)現(xiàn)的:

function myCheck(a) {
    check(a).gt(1).lt(3);
}

function myCheck2(a) {
    check(a).is("string");
}

+function (a) {
    check(a).or(myCheck, myCheck2);
}(2);

“使用鏈?zhǔn)秸{(diào)用記錄鏈?zhǔn)秸{(diào)用路徑”

顯然上面的寫法非常不方便,所以我實(shí)現(xiàn)了一種更好用的接口,使用同樣的鏈?zhǔn)秸{(diào)用方式,實(shí)現(xiàn)調(diào)用路徑提取和參數(shù)緩存。具體的實(shí)現(xiàn)方式在這篇文章里。最終實(shí)現(xiàn)了這樣的效果:

// 檢查 param 是否在區(qū)間(1,3) 與 (2,4) 的交集內(nèi)
check(param, "param").and(check.policy.gt(1).lt(3), check.policy.gt(2).lt(4));

// 檢查 param 是否在區(qū)間(1,2) 與 (3,4) 的并集內(nèi)
check(param, "param").or(check.policy.gt(1).lt(2), check.policy.gt(3).lt(4));

function myCheck(obj) {
    return obj.length > 4;
}

// 檢查 param 是否是數(shù)組并且長度大于 4
check(param, "param").and(check.policy.is("array"), myCheck);

// 檢查 param 是否*不是*[1,3]之間的偶數(shù)(即2)
check(param, "param").not.and(
    check.policy.is("number").not.lt(1).not.gt(3),
    function (obj) {
        return obj % 2 === 0;
    });

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/86403.html

相關(guān)文章

  • javascript 參數(shù)檢驗(yàn)(一):實(shí)現(xiàn)一個方便參數(shù)檢驗(yàn)工具

    摘要:本文嘗試編寫一種參數(shù)檢查工具,期待能緩解類似問題。為了實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,返回的是一個特殊的包裝對象。如果要打印出檢查失敗的參數(shù)名,需要寫成。由于德摩根定律的存在,后的參數(shù)表實(shí)際上在表達(dá)與的關(guān)系,比如表示的是參數(shù)既不為也不為。 綜述 javascript 屬于弱類型語言,參數(shù)的類型錯誤只能在運(yùn)行期發(fā)現(xiàn)。當(dāng)你需要 expose 非常健壯的接口給外部,或者在調(diào)試較大項(xiàng)目的時候,你可能會懷念強(qiáng)類型...

    maxmin 評論0 收藏0
  • 關(guān)于JavaScript對象,你所不知道事()- 再說屬性

    摘要:但好在還給我們提供了一個方法,每一個對象都有這樣一個方法,專門用來判斷某個屬性是否是該對象的私有屬性。如果你想要用對象字面形式,你只能在創(chuàng)建對象時定義訪問器屬性。在中,我們使用凍結(jié)一個對象,并且使用來判斷一個對象是否被凍結(jié)。 說完了對象那些不常用的冷知識,是時候來看看JavaScript中對象屬性有哪些有意思的東西了。 不出你所料,對象屬性自然也有其相應(yīng)的特征屬性,但是這個話題有點(diǎn)復(fù)雜...

    Richard_Gao 評論0 收藏0
  • 前端代碼評審 Checklist 清單

    摘要:從而輔助整個團(tuán)隊(duì)提高代碼質(zhì)量統(tǒng)一代碼規(guī)范。如果你的團(tuán)隊(duì)還沒有這么一份代碼評審清單,也許這正是你需要的如果你的團(tuán)隊(duì)已經(jīng)有了代碼評審參照標(biāo)準(zhǔn),這份清單也許能起到錦上添花的效果。如果違反這個規(guī)則,那么代碼會很難被測試或者重用。 前言 ? 前端團(tuán)隊(duì)有評審代碼的要求,但由于每個開發(fā)人員的水平不同,技術(shù)關(guān)注點(diǎn)不同,所以對代碼評審的關(guān)注點(diǎn)不同,為了保證代碼質(zhì)量,團(tuán)隊(duì)代碼風(fēng)格統(tǒng)一,特此擬定...

    xzavier 評論0 收藏0
  • 前端進(jìn)階之路: 前端架構(gòu)設(shè)計(jì)(3) - 測試核心

    摘要:而測試驅(qū)動開發(fā)技術(shù)并不只是單純的測試工作。需求向來就是軟件開發(fā)過程中感覺最不好明確描述易變的東西。這里說的需求不只是指用戶的需求,還包括對代碼 可能很多人和我一樣, 首次聽到前端架構(gòu)這個詞, 第一反應(yīng)是: 前端還有架構(gòu)這一說呢? 在后端開發(fā)領(lǐng)域, 系統(tǒng)規(guī)劃和可擴(kuò)展性非常關(guān)鍵, 因此架構(gòu)師備受重視, 早在開發(fā)工作啟動之前, 他們就被邀請加入到項(xiàng)目中, 而且他們會跟客戶討論即將建成的平臺的...

    Karuru 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<