资讯专栏INFORMATION COLUMN

javascript 参数检验(二):参数检查工具的完善

cheukyin / 1767人阅读

摘要:上一个版本的问题接这篇文章,聊聊参数检查工具的完善。最终实现了这样的效果检查是否在区间与的交集内检查是否在区间与的并集内检查是否是数组并且长度大于检查是否不是之间的偶数即

上一个版本的问题

接这篇文章,聊聊参数检查工具 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;
    });

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/86403.html

相关文章

  • javascript 参数检验(一):实现一个方便参数检验工具

    摘要:本文尝试编写一种参数检查工具,期待能缓解类似问题。为了实现链式调用,返回的是一个特殊的包装对象。如果要打印出检查失败的参数名,需要写成。由于德摩根定律的存在,后的参数表实际上在表达与的关系,比如表示的是参数既不为也不为。 综述 javascript 属于弱类型语言,参数的类型错误只能在运行期发现。当你需要 expose 非常健壮的接口给外部,或者在调试较大项目的时候,你可能会怀念强类型...

    maxmin 评论0 收藏0
  • 关于JavaScript对象,你所不知道事()- 再说属性

    摘要:但好在还给我们提供了一个方法,每一个对象都有这样一个方法,专门用来判断某个属性是否是该对象的私有属性。如果你想要用对象字面形式,你只能在创建对象时定义访问器属性。在中,我们使用冻结一个对象,并且使用来判断一个对象是否被冻结。 说完了对象那些不常用的冷知识,是时候来看看JavaScript中对象属性有哪些有意思的东西了。 不出你所料,对象属性自然也有其相应的特征属性,但是这个话题有点复杂...

    Richard_Gao 评论0 收藏0
  • 前端代码评审 Checklist 清单

    摘要:从而辅助整个团队提高代码质量统一代码规范。如果你的团队还没有这么一份代码评审清单,也许这正是你需要的如果你的团队已经有了代码评审参照标准,这份清单也许能起到锦上添花的效果。如果违反这个规则,那么代码会很难被测试或者重用。 前言 ​ 前端团队有评审代码的要求,但由于每个开发人员的水平不同,技术关注点不同,所以对代码评审的关注点不同,为了保证代码质量,团队代码风格统一,特此拟定...

    xzavier 评论0 收藏0
  • 前端进阶之路: 前端架构设计(3) - 测试核心

    摘要:而测试驱动开发技术并不只是单纯的测试工作。需求向来就是软件开发过程中感觉最不好明确描述易变的东西。这里说的需求不只是指用户的需求,还包括对代码 可能很多人和我一样, 首次听到前端架构这个词, 第一反应是: 前端还有架构这一说呢? 在后端开发领域, 系统规划和可扩展性非常关键, 因此架构师备受重视, 早在开发工作启动之前, 他们就被邀请加入到项目中, 而且他们会跟客户讨论即将建成的平台的...

    Karuru 评论0 收藏0

发表评论

0条评论

cheukyin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<