gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:53:11 24 4
gpt4 key购买 nike

我在几个项目中使用 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/

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