新闻资讯

新闻资讯 行业动态

如何编写高质量的 JS 函数——命名

编辑:008     时间:2020-02-17

一、目前前端的函数命名存在什么问题

从上图可以知道,命名和缓存是计算机科学中的两大难题。

本文要说的函数命名,虽然涉及到的范围较窄,但思想都一样,完全可以借鉴到其他的形式中。

之前阅读过代码大全中变量的相关章节,也针对性的了解过一些源码,根据我的经验总结,目前函数命名除了业界标准的问题外,还存在一些细节的问题,比如:

  • 中英语言的差异性

  • 不懂得从多维度去提升命名的准确性(如何从多维度去提升命名的准确性)

  • 不会使用辅助工具(如何使用辅助工具)

下面进行简明扼要的分析。

二、汉语和英语的差异性

1、为什么不能用汉语方式命名呢?

汉语拼音存在多义性;汉字翻译的辅助工具还不够普及,因此不能用汉语方式命名。

2、用英语时遇到的困难

最大的难点在于语法的正确使用场景。

举个例子, react 的生命周期,如下:

  • componentDidMount

  • componentWillReceiveProps

  • shouldComponentUpdate

很多人都会有疑问,为什么用 did 和 will 。

三、如何让命名有英语 style

举个例子:

  • componentDidMount 是 react 等生命周期的钩子,但是为什么要这样命名?

  • componentWillReceiveProps 为什么要这样命名?

答案就在下图:

注意上图中的 did 代表一般过去时,will 代表一般将来时。

然后我们百科一般过去式和一般将来时,如图所示。

(1)一般过去时:

(2)一般将来时:

看上图的红箭头,did 表示一般过去时,时是指动作发生的时间,用在这里,突出了钩子的含义,一旦 mount 成功就执行此函数。will 同理。

四、通过函数返回结果来命名

这是个小特性,比如 shouldComponentUpdate , 为什么 should 放在最前面。

因为这个函数返回的值是布尔值。那么我们可以理解为这是个问句,通过问句的形式来告诉我们,这里具有不确定性,需要根据返回值来判断是否更新。

五、借助工具

1、借助谷歌翻译

2、借助 codelf

这是一个神器,用来搜索各种开源项目中的变量命名,以供参考。

对应名字的 VSCODE 插件也有。

六、如何避免函数命名的多义性和不可读性

ramda 源码中的一个函数,代码如下:

var forEachObjIndexed = _curry2(function forEachObjIndexed(fn, obj) { var keyList = keys(obj); var idx = 0; while (idx < keyList.length) { var key = keyList[idx];
fn(obj[key], key, obj);
idx += 1;
} return obj;
}); export default forEachObjIndexed;

这个函数叫 forEachObjIndexed ,代码中看不出这个函数的命名含义,只能从从源码里面的函数注释中找答案。

由此知道,如果函数命名存在困难,可以通过注释的方式,将函数的整体介绍和说明输出文档来解决这个问题。

七、函数命名的分类

函数命名很普遍的一个现象就是带各种前缀的函数名,如下:

- $xxx()
- _xxx()

这种带各种前缀的函数名,看起来并不好看还别扭。核心原因是 JS 语言不支持私有变量,导致只能使用 _ 或者 $ 来保证相应的对外不可****见。

所以我把前端的函数命名分为两大类,如下:

第一类:不想暴露给外部访问的函数(比如只给内部使用)

第二类:暴露给外部访问的函数(各种功能方法)

而Symbol 初始化的函数命名是一种特例,代码如下:

const ADD = Symbol('add')

[ADD](a, b) { console.log('a + b')
}

八、总结

总结一下最佳实践:

多学习初中高中英语语法,开源项目中的函数命名没有那么难理解,通过语法的学习和借助工具,函数命名基本可以解决,如果遇到无法清晰描述所写函数的目的的命名时,请务必给函数写上良好注释,不管函数名字有多长多难懂,只要有良好的注释,那就是可以接受的一件事情。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

回复列表

相关推荐