上一个版本的题目
接这篇文章,聊聊参数搜检东西 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 的。
解决要领比较轻易想到的有两个:
转变接口形式,不再抛出异常,二是返回 false。如许 or 和 and 就很轻易完成了,然则链式挪用就没法完成了。
提取 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;
});