为什么常量不是用于Node.js中的事件?

Bog*_*scu 7 javascript design-patterns constants hardcoded node.js

我是节点的新手,但我来自广泛的编程背景.在我看过的任何地方(无论是在教程中还是在我看过的生产代码中),人们都压倒性地使用硬编码字符串而不是常量来识别事件.

我从npm 最依赖的软件包列表中选择了一个随机的例子来说明我的意思:«请求»库 - 为什么它们每次都输入字符串来发出消耗 «data»事件'data',而不是在库中定义不变?

在我所知道的任何编程语言中,使用常量都被认为是一种很好的实践,但是节点开发人员似乎完全满足于硬编码方法.为什么?

Gol*_*den 5

因为由于 JavaScript 的动态特性,它不适用于 Node.js。

假设一个模块定义了一个常量data。然后它需要将其导出,作为其事件发射 API 的一部分。例如:

const data = 'data';

class Api extends EventEmitter () {
  constructor () {
    setTimeout(() => {
      this.emit(data);
    }, 2 * 1000);
  }
}

module.exports = {
  data,
  Api
};
Run Code Online (Sandbox Code Playgroud)

然后,从外部我们会得到如下的东西:

const foo = require('./foo');

const { Api, data } = foo;

const api = new Api();

api.on(data, () => {
  // ...
});
Run Code Online (Sandbox Code Playgroud)

基本上是这样的。data如果你一开始就输错了怎么办?如果不是

const { Api, data } = foo;
Run Code Online (Sandbox Code Playgroud)

你输入错误:

const { Api, Data } = foo;
Run Code Online (Sandbox Code Playgroud)

它会工作,没有任何错误。Data就这样undefined。当您尝试访问不存在的对象的属性时,您不会在 JavaScript 中收到错误,您只会返回undefined

因此,您不会收到编译器错误,但现在您正在(在后台)发出“数据”,但您正在监听的是undefined. 该常量没有任何帮助,您仍然必须确保没有输入错误的名称。

这并不比使用不允许输错任何内容的字符串更好或更坏。

因此,长话短说,常量并不能改善情况,它们只会导致更多的输入并使事情变得更复杂 - 但它们并不能解决任何实际问题。