【问题标题】:Why nodejs use magic strings in its core modules willy-nilly?为什么 nodejs 在其核心模块中随意使用魔术字符串?
【发布时间】:2022-01-25 12:31:06
【问题描述】:

我正在学习 nodejs,并且之前有使用其他{强类型}语言的经验,我很难找到为什么在 nodejs 的核心模块中滥用魔法值(主要是字符串)的原因。

举个例子,让我们来看看http模块的实现,它有扩展EventEmitter的类并依赖字符串来识别事件,例如http.Server类及其'connection'、@987654327 @ 和 'request' 事件标识符。

这是有原因的吗?有没有更好的方法来实现这一点(比如只使用一个对象)?

【问题讨论】:

标签: javascript node.js


【解决方案1】:

有什么原因吗?

ECMAScript 没有枚举。要对它们建模,必须使用其中一种可用类型,即数字、字符串或对象(或符号,尽管它们比 NodeJS 更年轻)。现在“魔术字符串”比“魔术数字”或“魔术空对象”要好得多。

【讨论】:

  • 为了识别事件而声明一个对象或类类型怎么样?这难道不是比到处发送魔法值更好的方法吗?您还可以详细说明为什么魔术字符串比魔术数字“好得多”?
  • @underthevoid 很好,3 代表哪个事件(相比之下,“"connect" 代表什么)?当然,NodeJS 可以定义 const EVENT = { connect: "connect", ... };,但这只是介绍任何魔法值的容器
  • 也可能生态系统比 NodeJS 标准 API 移动得更快,所以 "connect" 已经众所周知,为其引入一些常量没有什么价值(因为没有人会使用它们)
  • 当然字符串比数字更具表现力,但是我想到的问题是关于一般的魔法值。您编写的方式使我认为,由于魔术字符串比魔术数字“好得多”,因此它们是解决魔术值通常在代码库中引入的问题领域的一种可接受的方法。
  • 问题说 EventEmitter 类是扩展的,这表明静态值可以在那里使用,例如EventEmitter.CONNECT_EVENT === "connect"。不需要额外的 EVENT 对象映射键到值。甚至 DOM API 也有这样的静态属性,例如Node.TEXT_NODE === 3Event.CAPTURING_PHASE === 1,但不适用于事件名称。
【解决方案2】:

我不能 100% 确定,但 Node 官方网站上的正式定义将 Node 描述为“基于 Chrome 的 V8 JavaScript 引擎构建的 JavaScript 运行时”。 v8 主要是为客户端构建的,即 web。因此,如果您查看web events,您会看到正在使用这种模式。大概这就是我想的原因。

【讨论】:

  • NodeJS 使用 V8 而不是另一个运行时(比如 SpiderMonkey)与 IMO 无关。然而,NodeJS API 是在 WebAPI 之后建模的,这是一个有效的观点,应该是您答案的核心。
  • 但问题特别提到了nodejs,这就是方向的原因。
  • @code 是的,但是 Node 基于 V8 的事实是无关紧要的。
猜你喜欢
  • 2021-11-09
  • 2014-10-12
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 2019-01-19
  • 2017-04-13
  • 2013-07-15
  • 1970-01-01
相关资源
最近更新 更多