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

标签 clojure datomic

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

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

  • 删除 uri库中的符号并将 uri 作为参数添加到访问数据库的每个函数
  • 通过 alter-var-root 更改它,或类似机制,在初始化函数中
  • 将其作为动态变量保存在库中 *uri*并覆盖希望小的适配器层中的值,例如

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

    (定义我的乐趣 [args]
    (with-datomic-uri my-uri
    (应用库/my-fun 参数))
  • 保管uri作为库中的原子
  • 最佳答案

    Stuart Sierra 上次 Clojure/West 做了一个演讲,名为 Clojure in the Large ,处理大型 Clojure 应用程序的设计模式。

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

    总结有关手头问题的提示:

    1 清除构造函数

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

      (defn make-connection [uri]
          {:uri uri
           ...}
    

    2 明确依赖关系
      (defn update-db [connection] 
         ...
    

    3 更容易测试
    (deftest t-update
      (let [conn (make-connection)]
        (is (= ... (update-db conn)))))
    

    4 更安全的重新加载
     (require ... :reload)
    

    将 uri 保存在稍后绑定(bind)的变量中是很常见的,但会引入隐藏的依赖关系,还假设 body在单个线程上开始和结束。

    观看谈话,更多关于设计的技巧。

    关于clojure - 如何处理需要在其外部设置的库中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20683724/

    相关文章:

    clojure - 如何更新/覆盖具有基数很多的 ref 属性?

    clojure - Datomic - 使用 OR 子句

    clojure - 在 Datomic 中查找具有特定属性的最旧和最新实体的日期?

    java - 将 Clojure 函数作为 java.util.Function 传递

    clojure - 两个函数相互递归调用

    loops - 无限循环重现

    java - Clojure 与 Java 的互操作 : how to call a class?

    java - 使用 clojure 中的 java api 读取 zip 文件