TW洞见 | 李光磊:JavaScript语言中五种消除分支的方法

最近开始使用JavaScript。回顾了一下这几天的代码,发现圈复杂度为1。30几个函数40多行,超过两行的函数都很少 (当然那种当做对象来用的函数除外,只说实际做事的函数。不要小看这40几行代码,完成了5个完整的具有用户价值的功能。JavaScript的表达能力不是盖的)。

由于JavaScript具备一些函数式编程语言的特征,写出没有分支没有显式循环的代码也属正常。但实际上多数代码还是命令式的。命令式风格也能写出圈复杂度为1的代码,看看都用到了哪些技巧。

多态

这种技巧在<<重构>>里提过,跟JavaScript没有多大关系。JavaScript对Duck Typing的支持,使得多态更容易实现。略过

Null Object Pattern

这个也跟JavaScript没多大关系。具体到js,简单说就是不要出现undefined和null,总是赋初值。string赋””,对象赋{ },等等,可以少很多判断

Dispatch Earlier,or “Boolean Parameter Considered Harmful”

这也是一种语言无关的策略。多说几句。简单来说就是但凡在函数内部需要根据参数进行判断走不同分支的时候,总应该存在一个更早的时机可以把执行路径分开,从而消除判断。或曰早一点分开也需要判断啊! 这是对的,但这个判断可以由用户做出,或者在程序的配置中做出,而无需运行时逻辑。举个简单的栗子: 用户点击网页对话框中的”确定”和”取消”时发给server端的请求应该如何设计?

一种是发送请求到如下URL: http://my.domain/some/question?agreed=1 或者 http://my.domain/some/question?agreed=0或者post的话同一个URL不同body。如果是这种设计,那server端必然有一个if来判断是确定还是取消。可用户点击的时候已经做出判断了啊,在程序中再做一次不是很多余吗?

另一种设计会利用用户的判断,点击”确定”或”取消”的请求会被发送到不同的URL,从而被路由到不同的server端的代码。处理”确定”的代码无需关心用户点击的是不是”确定”,因为只有用户点击”确定”后请求才会被送到你那里。类似桌面应用不同的按钮关联不同的事件处理程序。

那会不会有代码重复? 有就抽出来呗。

原文发布于微信公众号 - 思特沃克(ThoughtWorks)

原文发表时间:2015-01-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏屈定‘s Blog

设计模式--模板方法模式的思考

模板方法同样也是一种很实用的方法,目的是提高代码复用,并且统一大体的算法流程,比如一个一台电脑主机,定义好放置CPU,硬盘,内存等空位后,就形成了一个骨架,那么...

18040
来自专栏指尖下的Android

由单例模式的双判空所展开的思考

相信很多朋友对于单例模式都很熟悉,一般常见的就七八种,百度一大堆,这里聊一下双判空情况下的单例模式。 双判空单例是由单判空所演变而来的,是原来的一些程序员为了...

10110
来自专栏顶级程序员

总算搞清楚了回车和换行的来历与区别

总算搞清楚”回车”(carriage return)和”换行”(line feed)这两个概念的来历和区别了。 在计算机还没有出现之前,有一种叫做电传打字机(...

31050
来自专栏全华班

java招聘面试

过完年了,好多学习JAVA的同学在忙着找工作,大家先预习下这些基础知识 ,说不定能面试的时候考到。 基础篇 1 什么是Java、Java2、JDK?JDK后面...

45750
来自专栏Java技术栈

面象对象设计6大原则之二:开放封闭原则

开放封闭原则(OCP),The Open Closed Principle 定义 一个软件的实体,包括类、方法、模块、应该对扩展开放,对修改关闭。 也就是说一个...

30660
来自专栏CDA数据分析师

不可不知的一点Python陷阱

于易于学习以及快速开发更大更复杂的应用,Python渐渐在计算环境中无处不在。尽管明显的语言清晰度和友好会麻痹软件工程师和系统管理员的警觉性 —— 诱使他们编码...

34980
来自专栏佳爷的后花媛

h文件和c文件的区别include本身只是一个简单的文件包含预处理命令,即为把include的后面文件放到这条命令这里,除此之外,没有其它的用处(至少我也样认为).

其实在H文件里写函数也无所谓,只是不符合习惯而已。只要按照以上的格式写,一个H文件添加多少次都无所谓,

24620
来自专栏别先生

Javascript创建对象的学习和使用

1 <html> 2 <head> 3 <meta charset="utf-8"> 4 <title>javascript对象的学习</title> ...

20790
来自专栏java一日一条

有效处理Java异常的三个原则,你知道吗?

在有效使用异常的情况下,异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出,如果你的异常没有回答以上全部问题,那么可能...

18510
来自专栏Java3y

多线程基础必要知识点!看了学习多线程事半功倍

22280

扫码关注云+社区

领取腾讯云代金券