代码之家  ›  专栏  ›  技术社区  ›  Abhinav Sarkar

如何在Clojure库中设置配置参数?

  •  2
  • Abhinav Sarkar  · 技术社区  · 15 年前

    我正在编写Clojure库,我想知道设置库的配置参数的最佳实践是什么。

    许多库(如clojure contrib中的库)使用全局级参数,如 *buffer-size* 用户可以通过调用 set! 在他们身上。但对我来说,这似乎不是最好的方法,因为它创建了一个全球性的州,并且有可能发生名称冲突。

    另一种方法是在每个依赖于参数的函数调用中传递参数。如果有许多参数,那么可以使用它们的映射,而不是传递单个参数。

    例如,假设我正在编写一个缓存库。

    使用第一种方法,我有全局参数,比如 *cache-size*, *expiry-time*, *cache-dir* 用户等 集合! 这些(或不,并让它们成为默认值)和调用类似的函数 (set-in-cache id obj) (get-from-cache id) .

    使用第二种方法,用户首先创建参数映射并将其传递给每个调用

    (def cache-parameters {:cache-size 1000 
                           :expiry-time: 1440 
                           :cache-dir "c:\\cache"})
    (set-in-cache cache-parameters id obj)
    (get-from-cache cache-parameters id)
    

    那么,Clojure的首选方式是什么?为什么?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Michał Marczyk    15 年前

    实际上你不能 set! 诸如此类 c.c.io *buffer-size* 除非为它们安装线程本地绑定 binding , with-bindings 等等。只有少数var的线程本地绑定是由较低级别的clojure机器安装的,例如 *warn-on-reflection* *read-eval* 制造它们 集合! -能够在顶层;用户定义的变量不是 集合! -能够在最高层工作。var的根绑定可以用例如 alter-var-root , intern , def , .bindRoot …,但应谨慎使用。

    至于可重新绑定的变量与显式参数,问题的一部分是:使用显式参数几乎总是可以的,而且通常更可取,这是因为函数的可维护性增加了,这些函数清楚地显示了它们所依赖的所有数据块。也就是说,如果某个配置可能被设置一次,然后被应用程序/库中的几乎所有函数调用使用,那么它可能会使SANER代码定义一个耳罩的var,并将其文档化,并将配置放入其中(这可能是在表单之外更改var的根绑定的罕见情况之一)。哪一个定义可以)。

    总结一下,如果不确定——在显式参数传递方面出错,请使用最佳判断。

    推荐文章