javascript 參數檢驗(二):參數檢查工具的完善

上一個版本的問題

這篇文章,聊聊參數檢查工具 param-check 的完善。javascript

按照以前的接口設計,鏈式調用表示「與」,參數表表示「或」,天然產生了一個問題——若是我要表達「(A與B)或(C與D)」這樣的邏輯組合應該怎麼辦?java

以及,因爲 not 調用只對它後面的第一個調用生效,那麼若是我要實現「非(A與B)」,該怎麼辦?git

總結起來,實際上就是給邏輯表達式加括號的問題。github

or 和 and 方法

爲了自由表達與或關係,咱們須要擴展一下規則。分析可知,函數調用的參數表是一個自然的括號,因此只用來表達「或」太奢侈了。咱們添加方法 or 和 and,使之能表達與和或。可是這裏有個問題,param-check 目前的接口都是即時計算的,若是你把調用串當作參數傳遞,沒有傳進去以前已經計算完了,異常捕獲不到,無法實現邏輯關係。好比:編程

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

上面的代碼是無法實現 or 的。segmentfault

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

  1. 改變接口模式,再也不拋出異常,二是返回 false。這樣 or 和 and 就很容易實現了,可是鏈式調用就無法實現了。緩存

  2. 提取 check 的調用路徑,使得一個檢查過程能保存在一個對象(高階函數)裏,當作參數傳到其它函數中,本質上這是一種函數式編程方法。若是不考慮到書寫方便,這是很容易實現的:函數式編程

    function myCheck(a) {
        check(a).gt(1).lt(3);
    }
    
    function myCheck2(a) {
        check(a).is('string');
    }
    
    +function (a) {
        check(a).or(myCheck, myCheck2);
    }(2);

「使用鏈式調用記錄鏈式調用路徑」

顯然上面的寫法很是不方便,因此我實現了一種更好用的接口,使用一樣的鏈式調用方式,實現調用路徑提取和參數緩存。具體的實現方式在這篇文章裏。最終實現了這樣的效果:函數

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

// 檢查 param 是否在區間(1,2) 與 (3,4) 的並集內
check(param, 'param').or(check.policy.gt(1).lt(2), check.policy.gt(3).lt(4));

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

// 檢查 param 是不是數組而且長度大於 4
check(param, 'param').and(check.policy.is('array'), myCheck);

// 檢查 param 是否*不是*[1,3]之間的偶數(即2)
check(param, 'param').not.and(
    check.policy.is('number').not.lt(1).not.gt(3),
    function (obj) {
        return obj % 2 === 0;
    });
相關文章
相關標籤/搜索