在我的大部分Clojure程序......和很多其他Clojure程序我看到,有某種全局變量的一個原子:使用clojure的stm作爲一個全球性的國家被認爲是一種好的做法?
(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/讓我重新思考全局狀態,但不知何故,即使我完全文章同意,我認爲它好使用哈希映射中的原子,因爲它提供了一個通用的接口用於操縱全局狀態數據(類似於使用不同的數據庫來存儲您的數據)。
我想就此問題想一些其他想法。
不,這不是一個好習慣。避免它像瘟疫一樣。如果你必須這樣做,那麼儘量減少接觸或知道的代碼量。全球狀態是模塊化和組合性的敵人。它將代碼耦合在一起,難以重構或修復。 –
如果您想通過repl與程序進行交互,您需要擁有一些全局狀態。當然,你實際上並不需要告訴你的主程序狀態是在全球範圍內暴露出來的,最好是編程好像它不是。 – Cubic