我正在编写一个Clojure库,我想知道设置库配置参数的最佳实践是什么。
许多库(如clojure-contrib中的库)使用全局级参数,如*buffer-size*
,用户可以通过调用set!
来设置它们。但这对我来说似乎不是最好的方式,因为它创建了一个全局状态,并且存在名称冲突的可能性。
另一种方法是在每个依赖于它们的函数调用中传递参数。如果有很多参数,那么可以使用它们的地图而不是传递单个参数。
举个例子,假设我正在编写一个缓存库。
使用第一种方法我有*cache-size*, *expiry-time*, *cache-dir*
等全局参数。用户set!
这些(或不是默认值)并调用(set-in-cache id obj)
和{{1}等函数}}
使用第二种方法,用户首先创建参数图并将其传递给每个调用
(get-from-cache id)
那么哪种方式是Clojure的首选方式?为什么?
答案 0 :(得分:3)
实际上你不能set!
c.c.io
*buffer-size*
之类的内容,除非你为binding
,with-bindings
等安装了线程本地绑定。只有少数Vars的线程局部绑定由较低级别的Clojure机器安装,例如*warn-on-reflection*
和*read-eval*
,使它们set!
- 能够在顶级;用户定义的Vars不是set!
- 能够在顶级。 Var的根绑定可以用例如alter-var-root
,intern
,def
,.bindRoot
...,但这应该谨慎使用。
至于可重新绑定的Vars与显式参数问题的一部分:使用显式参数几乎总是正常的并且通常更可取,只是因为功能的可维护性增加,清楚地显示了它们所依赖的所有数据。话虽这么说,如果某些配置可能被设置一次,然后几乎每个函数调用在app /库中使用,它可能会使更健全的代码定义一个耳塞式Var,记录好并放置配置在其中(这可能是极少数情况之一,在定义的形式之外更改Var的根绑定可能没问题。)
总结一下,如果不确定,请使用您的最佳判断 - 错误地参与显式参数传递。