gpt4 book ai didi

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

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

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

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

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

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

使用第一种方法,我有全局参数,如 *cache-size*, *expiry-time*, *cache-dir*等。用户set! s 这些(或不让它们成为默认值)并调用像 (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 中的首选方式,为什么?

最佳答案

实际上你不能set!诸如 c.c.io 之类的东西的*buffer-size*除非您使用 binding 为它们安装线程本地绑定(bind)。 , with-bindings等等。只有少数 Vars 由较低级别的 Clojure 机器安装了线程本地绑定(bind),例如 *warn-on-reflection**read-eval* , 制作它们 set! - 能够在顶级;用户定义的变量不是 set! -能够在顶级。 Var 的根绑定(bind)可以通过例如更改alter-var-root , intern , def , .bindRoot ...,但这应该谨慎使用。

至于问题的可重新绑定(bind)的变量与显式参数的一部分:使用显式参数几乎总是可以的,而且通常更可取,这仅仅是因为函数的可维护性提高了,这些函数清楚地显示了它们所依赖的所有数据片段。话虽如此,如果某些配置可能只设置一次,然后被应用程序/库中的几乎每个函数调用使用,它可能会使代码更清晰地定义一个耳罩 Var,将其记录好并放置配置在其中(这可能是在定义的表单之外更改 Var 的根绑定(bind)的罕见情况之一)。

总而言之,如果不确定,请使用您的最佳判断——在显式参数传递方面犯错。

关于parameters - 如何在 clojure 库中设置配置参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3315865/

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