写点什么

编程好习惯之理清数据的可变性

用户头像
顿晓
关注
发布于: 2021 年 04 月 06 日
编程好习惯之理清数据的可变性

遇到的问题

部分人编程入门的语言是数据是可变的,把数据/变量理解为一个容器,里面的内容可以修改。

当遇到数据是不可变的语言或者不可变的操作时,总仍以可变的方式去理解,就会遇到下面类似的问题:

const list = [1, 2]list.concat([3, 4])console.log(list) // 期望得到 [1, 2, 3, 4]
复制代码

上面是把 concat 当做 push 来用了。


还有就是用法不够 idiom,如下:

const list = [1, 2, 3, 4]
const result = []list.map(value => result.push(value + 1))
console.log(result)
复制代码

上面是把 map 当做 forEach 来用了。


idiom 的用法如下:

const list = [1, 2, 3, 4]
const result = list.map(value => value + 1)
console.log(result)
复制代码

分析

以上错误常见于初学者中,虽然多犯几次就掌握来,但有不是比例的人会犯同一类错误,说明设计上在这块的考虑还不够。

其中原因之一是:这些用法容易混淆。

如:list.concatlist.push,此处的 concat 其实充当了一个函数的角色,而不是面向对象中的类方法。具体来说就是面向对象的方法调用容易让人有个误区:对象的所有方法调用都会修改对象内的数据,像 list.concat 就被理解成 list 的数据被修改了,list.map 也类似。

有的语言不提供这样的使用方式,而是把 concat map 用自由函数的方式提供,就会避免理解错误,如下:

const result = concat(list, [5, 6])const result = map(list, value => value + 1)
复制代码


另外一个可以避免犯错的方法是:多看方法的函数签名,尤其注意返回值。

发布于: 2021 年 04 月 06 日阅读数: 18
用户头像

顿晓

关注

因观黑白愕然悟,顿晓三百六十路。 2017.10.17 加入

视频号「编程日课」 知识星球「俺的死党顶」

评论

发布
暂无评论
编程好习惯之理清数据的可变性