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

时间:2010-07-23 06:43:16

标签: parameters clojure

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

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

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

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

使用第一种方法我有*cache-size*, *expiry-time*, *cache-dir*等全局参数。用户set!这些(或不是默认值)并调用(set-in-cache id obj)和{{1}等函数}}

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

(get-from-cache id)

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

1 个答案:

答案 0 :(得分:3)

实际上你不能set! c.c.io *buffer-size*之类的内容,除非你为bindingwith-bindings等安装了线程本地绑定。只有少数Vars的线程局部绑定由较低级别的Clojure机器安装,例如*warn-on-reflection**read-eval*,使它们set! - 能够在顶级;用户定义的Vars不是set! - 能够在顶级。 Var的根绑定可以用例如alter-var-rootinterndef.bindRoot ...,但这应该谨慎使用。

至于可重新绑定的Vars与显式参数问题的一部分:使用显式参数几乎总是正常的并且通常更可取,只是因为功能的可维护性增加,清楚地显示了它们所依赖的所有数据。话虽这么说,如果某些配置可能被设置一次,然后几乎每个函数调用在app /库中使用,它可能会使更健全的代码定义一个耳塞式Var,记录好并放置配置在其中(这可能是极少数情况之一,在定义的形式之外更改Var的根绑定可能没问题。)

总结一下,如果不确定,请使用您的最佳判断 - 错误地参与显式参数传递。