javascript 参数检验(二):参数搜检东西的完美

上一个版本的题目

这篇文章,聊聊参数搜检东西 param-check 的完美。

根据之前的接口设想,链式挪用示意“与”,参数表示意“或”,自然产生了一个题目——假如我要表达“(A与B)或(C与D)”如许的逻辑组合应当怎么办?

以及,因为 not 挪用只对它背面的第一个挪用见效,那末假如我要完成“非(A与B)”,该怎么办?

总结起来,实际上就是给逻辑表达式加括号的题目。

or 和 and 要领

为了自在表达与或关联,我们须要扩大一下划定规矩。剖析可知,函数挪用的参数表是一个自然的括号,所以只用来表达“或”太奢靡了。我们增加要领 or 和 and,使之能表达与和或。然则这里有个题目,param-check 现在的接口都是立即盘算的,假如你把挪用串当作参数通报,没有传进去之前已盘算完了,异常捕捉不到,没法完成逻辑关联。比方:

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

上面的代码是没法完成 or 的。

解决要领比较轻易想到的有两个:

  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;
    });
    原文作者:Y3G
    原文地址: https://segmentfault.com/a/1190000006041175
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞