在《从 if else 到 switch case 再到抽象》这篇文章里面说到,解决 if else 和 switch case 分支过多的一个方法,就是做一个专用的 dispatcher ,让它来负责进行筛选与转发。至于筛选条件的描述,模式匹配是一种很常见也很好用的方式。在 JavaScript 里面,用 JSON 来描述模式又是相当方便的事情,所以我们来做一个 JSON 模式匹配工具吧。
用例设计
作为一个 dispatcher ,我们只需要两个方法: notify
和 capture
。一个最简单的用例是这样的:
1 Dispatcher.capture({
2 " status " : 200 ,
3 " command " : " message "
4 }, function (json) { /* display message */ });
5
6 Dispatcher.notify({
7 “status " : 200,
8 " command " : " message " ,
9 " content " : {
10 " from " : " user1 " ,
11 " to " : " user2 " ,
12 " text " : " hello "
13 }
14 });
当然,只有局部的全等匹配是不够的,我们还需要一些其他运算符。
1 Dispatcher.capture({
2 " value1$eq " : " hello " , /* equal */
3 " value2$ne " : true , /* not equal */
4 " value3$lt " : 0 , /* less than */
5 " value4$lte: 1, /* less than or equal */
6 " value5$gt " : 2, /* greater than */
7 " value6$gte " : 3, /* greater than or equal */
8 " value7$ in " : [1, 3, 5, 7, 9], /* in */
9 " value8$nin " : [2, 4, 6, 8, 10], /* not in */
10 " value9$all " : [1, 2, 3, 4, 5], /* all */
11 " value10$ex " : true, /* exists */
12 " value11$re " : /^A.*/, /* regular expression */
13 " value12$ld " : function(json) { return true; } /* lambda */
14 }, function(json) {});
15
16 Dispatcher.notify({
17 " value1 " : " hello " ,
18 " value2 " : false,
19 " value3 " : -1,
20 " value4 " : 1,
21 " value5 " : 3,
22 " value6 " : 3,
23 " value7 " : 5,
24 " value8 " : 5,
25 " value9 " : [1, 3, 5, 2, 4],
26 " value10 " : " hello " ,
27 " value11 " : " A13579 " ,
28 " value12 " : " anything "
29 })
随手写下来一堆运算符,看起来实现会很复杂?其实不会有多复杂。在下一篇文章里面,我们会讨论如何设计一个运算符接口,然后逐一实现这些运算符。如果你对此有兴趣,欢迎在 Twitter 上关注我: @CatChen fe36787aa9174b739667caeaa60d33b9
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容