【问题标题】:Using a global variable to prevent code executing repeatedly unnecessarily使用全局变量来防止代码不必要地重复执行
【发布时间】:2020-05-11 04:16:51
【问题描述】:

TL;DR:使用全局变量来防止代码不必要地执行是不好的做法,如果是,有什么替代方法?

我有一个 Electron 应用程序,它从另一个应用程序读取实时数据流并将其中的一些元素输出到屏幕上。

接收到的数据有两种,一种是关于当前情况的实时(遥测)数据,另一种是每隔几秒更新一次的静态数据(sessionInfo)。

第一次收到 sessionInfo 数据包时,我需要根据其中的一些数据来定位和调整一些 UI 元素的大小。这些数据在应用程序使用过程中绝对不会改变,所以我不希望基于它的计算被执行多次*。 我需要监听所有的 sessionInfo 数据包,收到时我会用它们做其他事情,只是数据的这个特定部分只需要考虑一次。

鉴于上述情况,在这种情况下是否适合使用全局变量来存储此信息(或者甚至只是一个表示此信息已被处理的标志)并使用它来防止代码执行多次?我所有的阅读都表明全局变量从来都不是一个好主意,但是如果不能让这段代码重复执行,我不确定我在这里有什么替代方案。

*我认识到允许这样做可能不会对我的应用程序产生任何实际影响,但这对我来说是一次学习经历,同时也产生了一些有用的东西,所以我想了解“正确”的方法,而不仅仅是将一些低效的东西放在一起并让它发挥作用。

【问题讨论】:

  • 几乎没有全局变量是最佳选择的情况,也从来没有出现标志的全局变量是最佳选择的情况。
  • 既然您要检查的是 UI 的状态,也许您应该只检查 UI 的状态,看看它是否已经定位?该状态是全局可用的,但您不必在 node.js 代码中引入全局变量来执行此操作。您可以检查某个元素的位置,也可以检查某个已知 UI 元素的属性以查看工作是否已经完成。与往常一样,如果您展示所涉及的实际代码,我们可以提供更详细的建议。

标签: javascript node.js scope electron global


【解决方案1】:

全局变量通常是一种不好的做法,原因如下:

  • 它们污染了全局范围,所以如果你创建一个全局i,你 不能在其他任何地方使用该名称。
  • 它们使对代码进行单元测试变得不可能或非常困难。
  • 您最终需要的通常比您想象的要多,以至于很多事情都变得全球化。

更好的做法是创建单例服务。例如,您可能会创建一个 SessionService 类来处理您的所有身份验证内容。或者,也许是一个保存数据流状态变量的 DataStreamService。要访问该单例,您可以将它导入到任何需要它的文件中。一些框架走得更远,有一个单一的全局数据存储,比如 react/redux。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多