gpt4 book ai didi

clojure - 使用 clojure 的 stm 作为全局状态被认为是一种好的做法吗?

转载 作者:行者123 更新时间:2023-12-02 22:24:47 24 4
gpt4 key购买 nike

在我的大多数 clojure 程序中……以及我看到的许多其他 clojure 程序中,原子中有某种全局变量:

(def *program-state* 
(atom {:name "Program"
:var1 1
:var2 "Another value"}))

并且这个状态会偶尔在代码中被引用。

(defn program-name []
(:name @*program-state*))

阅读本文http://misko.hevery.com/2008/07/24/how-to-write-3v1l-untestable-code/让我重新思考全局状态,但不知何故,尽管我完全同意这篇文章,但我认为在原子中使用 HashMap 是可以的,因为它提供了一个用于操作全局状态数据的通用接口(interface)(类似于使用不同的数据库来存储你的数据) .

我想就此事提出一些其他想法。

最佳答案

这种事情还可以,但它通常也是一种设计味道,所以我会谨慎对待。

需要考虑的事情:

  • 一致性 - 代码的一部分可以更改程序名称吗?如果是这样,那么从其他线程的角度来看,program-name 函数的行为将不一致。不好!
  • 可测试性 - 这容易测试吗?正在更改程序名称的测试套件的一部分能否与正在读取名称的另一测试安全地同时运行?
  • 多个实例 - 应用程序的两个不同部分是否会同时使用不同的程序名称?如果是这样,这强烈暗示您的可变状态不应该是全局的。

要考虑的替代方案:

  • 使用ref 而不是atom,您至少可以确保事务中可变状态的一致性
  • 使用绑定(bind),您可以将可变性限制在每个线程的基础上。这解决了大部分并发问题,并且当您的全局变量被用作一组线程本地配置参数时会很有帮助。
  • 尽可能使用不可变的全局状态。它真的需要可变吗?

关于clojure - 使用 clojure 的 stm 作为全局状态被认为是一种好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13130748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com