问题标签 [global-state]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
53 浏览

java - Changing and sending globally needed data

I would like to ask about best-practice how to hold and change a global state of application. I have a Parser (which now is a singleton) which among others have properties like

Then I have about ten modules with a very simple interface

Some modules do need to (some modules do not) get or set mode of the already processed file.

or

which changes a state of the application and parser itself and other modules work with it.

Two modules (of ten) also want to add to loadedResources

but others not.

I do not like storing the global data in singleton and have modules reaching for it (because of tests and so on) but I do not even like that I would need to send all eventually needed information to modules which can process them... and then create big objects to return which would tell the Parser how to change the state (as well as the "globally needed" data can change over time), however it would probably be much cleaner. What are your suggestions? Thanks in advance.

0 投票
0 回答
158 浏览

php - 运行时信息(如类元数据)可以接受 PHP 全局状态吗?

我正在努力使用全局状态来存储有关 PHP 中类元数据的运行时信息。由于显而易见的原因,全局状态被认为是“坏的”,所以我想尽可能地避免它。虽然,我仍然不知道在哪些情况下它是真正可以接受的,在哪些情况下不是。为了提供一个具体的例子,让我们以 PHP 中的 Enum 类型实现为例,其中每个具体的 Enum 类型都扩展了一个抽象 Enum 类型,它使用反射将子类的常量读取为有效的 Enum 值。

我在这里看到的可能问题是 resolveConstants() 方法,它使用反射来解析子类的常量。考虑在运行时必须创建大量 Enum 实例的情况。在每个实例上使用反射可能会对性能产生严重影响,因此仅在某个 Enum 类型的第一个实例上“延迟加载”类元数据似乎是一种好方法。但是我必须使用全局状态才能完成,这似乎也是错误的。也许这不是最好的例子,但它表明了我对性能问题的关注。可能还有其他用例,必须广泛使用反射和类元数据自省才能将对象设置为状态。一般来说,拥有这种全球性状态是否可以接受,或者是否有其他选择可以实现这样的目标?我不喜欢使用单独的类来提供类元数据,因为像 Enum 这样的简单值对象的依赖注入似乎是开销。

0 投票
1 回答
1270 浏览

ruby - 为什么全局状态不好?

前几天我在#ruby-lang 频道上与某人讨论了@@class_variables. 当用户询问跟踪连接到他的服务器的用户的最佳方式是什么时,这一切都开始了(我稍微简化了它,但这就是它的要点)。

所以,我建议:

然而,somone 说这里使用全局状态被认为是不好的做法。

我理解为什么全局状态对依赖多个后端的东西不利,因为全局状态的全局部分不再如此全球化,而是本地化到那个后端。或者它会干扰依赖注入。

不过,我真的想不出任何其他原因导致这很糟糕。而且,如果并发性成为问题(需要多个后端),那么我们可以更新代码以使用 Redis(或类似的东西)。

另外,我在programmers.sxc 上发现了这个问题,但这并不能帮助我理解为什么上面的代码被认为如此糟糕?另外,还有什么替代方案?

0 投票
1 回答
440 浏览

java - Singleton Util 类的替代方案

所以我有这样的课:

因此,基本上我自己有一个 Singleton 类,第一次使用它时,设置一个配置对象,然后继续监听 get 调用。这个类有很多问题:

  1. 由于 Singleton 和配置文件之间的紧密耦合,对 HBaseUtil 类中的静态方法进行单元测试变得困难。
  2. 我真正想要的是能够为类提供文件名/文件名+路径,以便它可以进入那里,从该文件中读取配置属性并将它们提供给传入的读取请求。不过这里有一个重要注意事项:我需要这种灵活性,以便在每次 JVM 启动时仅指定一次属性文件。所以我当然不需要维护状态。

这是我能想到的:我有一个普通类,其中包含所有静态方法且未定义显式构造函数,而不是 Singleton。

然后,而不是像这样在我的其他代码中使用该类:

我会这样使用它:

我的问题:

  1. 我什至在思考正确的方向吗?我的要求是每个 JVM 只在类中具有一次灵活性。为此,我的项目中需要配置的只是 HBase .properties 文件的位置/内容。我在想有一个单例对于这个要求来说是多余的。
  2. 对于我的要求,还有哪些更好的方法(如上所述)?

谢谢!

注意:我已经阅读了这个StackOverflow 讨论,但现在它让我更加困惑。

0 投票
9 回答
103354 浏览

php - Laravel:在哪里存储全局数组数据和常量?

我刚开始使用 Laravel。我需要重写我几年前制作的整个系统,使用 Laravel 4 作为基础框架。在我的旧系统中,我曾经有一个constant.php声明了一些常量的globals.php文件,以及一个包含许多数组集(例如,类别状态、事件类型、语言等)的文件。通过这样做,我可以使用类似的东西

在我的应用程序的任何地方。

我的问题是,我怎样才能以所谓的“laravel 方式”存储这些信息。我尝试使用某种对象来存储此信息,将其设置为服务并为其创建一个外观:

应用程序/库/项目/Constants.php

应用程序/库/项目/ConstantsServiceProvider.php

应用程序/库/项目/ConstantsFacade.php

作曲家.json

所以我访问该属性为PJ\Constants::$langs.

这行得通,但我怀疑这是最有效或最正确的方法。我的意思是,通过创建一个完整的服务提供者和外观以及所有这些东西来“传播”一个变量是正确的方法吗?或者我应该把这些数据放在哪里?

感谢您的任何建议。

编辑#01

我想传递给所有控制器和视图的数据可以直接在脚本中设置,就像我帖子开头的示例一样,它也可以动态生成,例如从数据库中生成。该数据可以是类别列表。我需要它们在所有视图中生成导航栏,但我还需要它们来定义一些路由模式(如/category/subcategory/product),并解析多个控制器中的一些信息(如从包含 X 产品的类别中获取信息)。

我的数组是这样的:

举个例子。Index 是类别的 id,Value 是与类别相关的信息。

我需要这个数组,也可以在所有控制器和视图中使用。

那么,我应该将其保存为 Config 变量吗?我还能如何存储这些数据;什么是最好的和语义正确的方法?

0 投票
2 回答
2437 浏览

python - python的`unittest.mock.patch`会改变全局状态吗?

我正在尝试确定 Python 的mock.patchunittest.mock.patch在 Py3 中)上下文管理器是否会改变全局状态,即它是否是线程安全的。

例如:让我们想象一个线程使用上下文管理器在函数bar内修补函数foo,然后在上下文管理器内部,解释器暂停该线程(由于 GIL 等)并恢复另一个foo在所述上下文管理器之外运行的线程。如果patch是线程安全的,我希望函数的全局状态foobar未修改,因此第二个线程将获得foo. 但是如果patch修改全局状态,第二个线程将获得修改后的行为,foo即使它不在上下文管理器中。

我参考了源代码,但仅通过查看无法清楚地分辨出来。

0 投票
1 回答
805 浏览

ios - 如何避免 Swift 中的全局状态

我一直在阅读有关避免可变状态的文章,以及单例模式如何不利于拥有全局状态。

我看到关于依赖注入http://www.objc.io/issue-13/singletons.html的答案很少,但我找不到如何解决这个基本方法:

如何维护应用程序周围的用户数据?解决方案是将用户信息从一个视图(webservice请求的位置)通过视图通过参数传递到七个推送视图(再次需要哪里)?

有更好的方法吗?或者有时需要单例模式?

0 投票
4 回答
415 浏览

javascript - 如何避免 React 应用程序中的全局状态?

在我的 React 应用程序中,我需要存储一些几乎可以在任何地方访问的数据,但不想将其保存在全局(即静态)数据结构中,以便轻松模拟我的单元测试和时尚指南。

我的意思是例如:

  • 浏览器构建和 Node.js 中IN_BROWSER的常量。truefalse
  • IS_MOBILE在浏览器启动时初始化的常量
  • 当前登录用户的数据,
  • 我连接到的 API 的 url(它是 localhost、登台服务器或生产,取决于配置)

现在我有一个名为sessionData.js存储这些数据的文件,每当我需要时,我都会require('./sessionData')在我的代码中使用它。我可以使用它来模拟我的单元测试,rewire并且当它们按顺序运行时,它现在可以正常工作。这对样式指南来说是有问题的,因为每个示例都可以从不同用户的角度显示视图(因此理想情况下,每个示例都有自己的sessionData)。

IN_BROWSER目前是 a global,这也是一个坏主意,因为它对每个模块的初始化代码都有隐式依赖。

我看到我可以sessionData通过道具将我的和其他的东西传递给层次结构中的每个组件,但这似乎有很多冗余。

有没有更好的设计模式来解决它?

0 投票
1 回答
185 浏览

java - 为避免全局状态的 REST 服务器存储和加载配置(即单例、上下文和依赖注入)

我正在使用 tomcat 开发 Java 架构,我遇到了一种我认为非常通用的情况,但是,在阅读了 StackOverflow 中的几个问题/答案之后,我找不到明确的答案。我的架构有一个 REST API(在 tomcat 上运行),它接收一个或多个文件及其关联的元数据并将它们写入存储。存储层的配置与 REST API 服务器是 1-1 的关系,因此直观的方法是编写一个 Singleton 来保存该配置。

显然,我知道由于全局状态和模拟 Singleton 的困难,Singleton 会带来可测试性问题。我也想过使用上下文模式,但我不相信上下文模式适用于这种情况,我担心我最终会使用“上下文反模式”进行编码。

让我给你一些关于我所写内容的更多背景知识。该架构由以下组件组成:

  • 向 REST API 发送请求的客户端以 JSON 或 XML 格式上传或检索“保存对象”,或者简单地说,PO(文件 + 元数据)。

  • 接收来自客户端的请求并将数据存储在存储层中的高级 REST API。

  • 一个存储层,可能包含 OpenStack Swift 容器、磁带库和文件系统的组合。这些“存储容器”中的每一个(为简单起见,我称其为文件系统容器)在我的体系结构中称为端点。存储层显然不在 REST API 所在的同一台服务器上。

端点的配置是通过 REST API 完成的(例如 POST /configEndpoint),因此管理用户可以通过 HTTP 调用注册新的端点、编辑或删除现有的端点。虽然我只使用 OpenStack Swift 端点实现了架构,但我预计每个端点的信息至少包含一个 IP 地址、某种形式的身份验证信息和一个驱动程序名称,例如“Swift 驱动程序”、“LTFS 驱动程序”等(这样当新的存储技术出现时,只要有人为其编写驱动程序,它们就可以轻松地集成到我的架构中)。

我的问题是:如何以可测试、可重用和优雅的方式存储和加载配置?我什至不会考虑将配置对象传递给实现 REST API 调用的所有各种方法。

REST API 调用和配置发挥作用的几个示例:


** 更新 #1 - 我的实现基于@mawalker 的评论 **

使用建议的答案在下面找到我的实现。工厂创建实现较低级别存储操作的具体策略对象。上下文对象(由中间件来回传递)包含一个抽象类型的对象(在本例中为接口)StorageContainerStrategy(其实现将取决于运行时每个特定情况下的存储类型)。





0 投票
1 回答
434 浏览

reactjs - 无法从全局状态(Redux)中获取价值

我无法在我的项目中创建此共享组件。这是其代码的简化版本:

当我尝试添加console.logalert在我的内部添加时,我mapStateToProps什么也没得到,似乎我无法从我的SharedView. 我知道我可以将其重写为 class SharedView extends Component { ...,但由于某些原因,我需要保留格式。

任何想法如何获得这个全局状态值?