如何处理需要在其外部设置的库中的变量?

kon*_*onr 7 clojure datomic

我在几个项目中使用Datomic,是时候将所有常用代码移动到一个小型实用程序库中.

一个挑战是处理uri大多数操作所依赖的共享数据库,但必须由项目使用库设置.我想知道是否有一种成熟的方法来做到这一点.以下是我想过的一些替代方案:

  • 删除uri库中的符号,并将uri作为参数添加到访问数据库的每个函数中

  • alter-var-root在init函数中通过或类似机制对其进行更改

  • 将它作为动态var保存在库中,*uri*并覆盖希望小的适配器层中的值

    (def my-url ... bla ...)

    (defn my-fun [args](with-datomic-uri my-uri (apply library/my-fun args))

  • 保持uri图书馆的原子

Gui*_*ler 4

Stuart Sierra 上次在 Clojure/West 上做了一次名为Clojure in the Large的演示,讨论了大型 Clojure 应用程序的设计模式。

其中之一就是您所描述的问题。

总结有关当前问题的提示:

1 清除构造函数

所以你有一个明确定义的初始状态。

  (defn make-connection [uri]
      {:uri uri
       ...}
Run Code Online (Sandbox Code Playgroud)

2 明确依赖关系

  (defn update-db [connection] 
     ...
Run Code Online (Sandbox Code Playgroud)

3 测试更容易

(deftest t-update
  (let [conn (make-connection)]
    (is (= ... (update-db conn)))))
Run Code Online (Sandbox Code Playgroud)

4 重新加载更安全

 (require ... :reload)
Run Code Online (Sandbox Code Playgroud)

uri保留在稍后绑定的变量中非常常见,但会引入隐藏的依赖项,并且还假设body在单个线程上开始和结束。

观看演讲,了解更多设计技巧。