上一个版本的问题

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

javascript 参数检验(二):参数检查工具的完善相关推荐

  1. Flow - JS静态类型检查工具

    本章的目标是提供一些Flow工具的介绍与使用建议.Flow本质上也只是个检查工具,它并不会自动修正代码中的错误,也不会强制说你没按照它的警告消息修正,就不会让你运行程序.当然,并没有要求什么时候一定要 ...

  2. JavaScript代码检查工具——JSLintMate

    JSLintMate是一款快速.简洁.易于使用JSLint(Douglas Crockford强大的JS代码检查工具)或者JSHint来检查JavaScript代码的扩展工具. JSLintMate是 ...

  3. istanbul —— JavaScript 代码覆盖率检查工具

    istanbul 是一个 JavaScript 的代码覆盖率检查工具. https://yqfile.alicdn.com/e6425e746f3af8cef9c3e64dde6ff2f9a33692 ...

  4. py获取前端的参数_Python小工具系列(3)之参数检查

    #Python小工具系列# python 这是Python小工具系列第三篇,以往分别有 1.Python小工具系列(1)之file_cache 2.Python小工具系列(2)之Test_all 这次 ...

  5. React Native工程中TSLint静态检查工具的探索之路

    背景 建立的代码规范没人遵守,项目中遍地风格迥异的代码,你会不会抓狂? 通过测试用例的程序还会出现Bug,而原因仅仅是自己犯下的低级错误,你会不会抓狂? 某种代码写法存在问题导致崩溃时,只能全工程检查 ...

  6. HTML代码风格检查工具对比

    选用一个合适的工具对 HTML 代码进行质量控制会是一件很有意义的事情.本文选择了 Bootlint.AriaLinter.htmllint.HTMLHint 及htmlcs 这五个目前最活跃的相关项 ...

  7. 安装Ubuntu后必须要做的几件事(二)--开发工具篇

    链接 链接 安装Ubuntu后必须要做的几件事(一)–基础应用篇 安装Ubuntu后必须要做的几件事(二)–开发工具篇 终端的乐趣–Linux下有趣的终端命令或者工具 Ubuntu使用apt-file ...

  8. JS代码检查工具ESLint

    前面的话 ESLint是一个JavaScript代码静态检查工具,可以检查JavaScript的语法错误,提示潜在的bug,可以有效提高代码质量,维持前端团队高度一致的编码风格.ESLint不但提供一 ...

  9. 【JVM】优化参数+优化工具

    [JVM]优化参数+优化工具 (一)上线前评估的时候JVM设置合适的参数 [1]JVM参数 [2]典型JVM参数配置参考 [3]内存结构分析 (二)什么时候需要JVM调优?具体的指标? [1]如果使用 ...

最新文章

  1. excel随机数_Excel使用函数生成1100的不重复随机数 2种方法
  2. 线程同步之生产者-消费者问题
  3. ef1a启动子_常见的真核和原核表达系统的启动子(promoters)
  4. 【C/C++13】天气APP:数据挖掘/HTTP协议/非结构化数据存储(filetoblob.cpp),数据管理/监控告警(hsmtable.cpp,tbspaceinfo.cpp)
  5. iOS开发-证书问题精析~
  6. 大工14秋《计算机应用基础》在线测试2,2017大工《计算机应用基础》在线测试2答案.doc...
  7. docker web程序本地化_想要成为前端Star 吗?一首歌时间将React / Vue 应用Docker 化...
  8. webpack 编译完成执行代码
  9. 【非科班告诉你】前端自学从小白到入门
  10. 序《戎马书生马福祥》
  11. Windows 下安装 Redis 1
  12. windows下matplotlib.pyplot图像中显示中文的方法
  13. linux7 yum安装Mysql5.7
  14. C++中的文件输入/输出
  15. 数据库的开窗函数学习
  16. office软件不显示图标
  17. Processing创意编程(进阶篇)
  18. Guided Anchoring:在线稀疏anchor生成方案,嵌入即提2AP | CVPR 2019
  19. 关于紫边、紫晕、Color shading成因的总结
  20. fcpx插件:PremiumVFX Comic Titles(手绘漫画风格的标题和背景

热门文章

  1. Python解决爬虫中文返回乱码问题
  2. ZeroMQ接口函数之 :zmq_setsockopt –设置ZMQ socket的属性
  3. python多进程管道通信(精)
  4. annotation的理解
  5. OLW (Open Live Writer)安装代码高亮插件方法(简明)
  6. windows获取IP和MAC地址【Qt】
  7. 【转】ASP.NET MVC框架下使用MVVM模式-KnockOutJS+JQ模板例子
  8. javascript实现jsonp跨域问题+原理
  9. [注]什么是用户?估计90%人不知道
  10. 还在使用 Windows?我的70岁母亲都用了 21 年 Linux