在我的大多数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/让我重新思考全球状态但不知何故,即使我完全同意这篇文章,我认为可以在原子中使用哈希映射,因为它提供了一个用于操纵全局状态数据的通用接口(类似于使用不同的数据库来存储您的数据)。
我想就此事提出一些其他想法。
答案 0 :(得分:2)
我认为拥有一个偶尔以交换方式更新的单一全球状态是可以的。当你开始有两个需要更新的全局状态并且线程开始使用它们进行通信时,我开始担心。
答案 1 :(得分:2)
这种东西可以没问题,但它也常常是一种设计气味所以我会谨慎对待。
要考虑的事情:
program-name
函数将从其他线程的角度来看表现不一致。不好! 需要考虑的替代方案:
答案 2 :(得分:1)
我认为拥有这样一个全局状态(在许多情况下它是必需的)是很好的但我会小心我的应用程序的核心逻辑具有将状态作为参数并返回更新状态的函数而不是直接访问全球状态。基本上我宁愿从几组函数中控制访问全局状态,我程序中的其他所有东西都应该使用这些方法来访问状态,因为这样可以抽象出状态实现,即最初我可以启动使用内存中的原子,然后可能会移动到某个持久存储。