与其返回我的库并添加“调试”标志参数,我认为一旦在我的应用程序的命令行上读取了调试标志 (0/1),就可以设置一次 ref,然后由任何函数访问如果设置了调试标志,则需要做一些事情。
这是处理无参数调试的合理方法,还是我的想法太像拥有一个“禁止”的全局变量?
谢谢。
与其返回我的库并添加“调试”标志参数,我认为一旦在我的应用程序的命令行上读取了调试标志 (0/1),就可以设置一次 ref,然后由任何函数访问如果设置了调试标志,则需要做一些事情。
这是处理无参数调试的合理方法,还是我的想法太像拥有一个“禁止”的全局变量?
谢谢。
我建议您避免重复(when *debug* ...)
所有代码。这是宏的主要目标。编写一个执行该检查的宏,因此您可以使用类似(debug ...stuff...)
. 好的,它并没有更短,但是它将您的代码与检查调试标志的细节分离。更好的是,它为您提供了编写代码的机会,该代码完全消除了调试标志的运行时检查,并且只在编译时进行。
您对该标志的使用符合应用程序配置,这很好。前进!
这种事情的全局是好的,尽管使用 ref 来存储它并不是很合适,因为那样你就需要在事务中完成所有日志记录(即在 a 中(dosync)
)。
由于您不太可能真正关心“启用日志记录”的竞争条件,因此不需要特殊保护。你会用耳罩标记这个变量以表示它具有特殊含义......
这样的事情会很好:
(def ^{:dynamic true} *debug-enabled* false)
(def ^{:dynamic true} *info-enabled* false)
(defn- log [level s]
(println (apply str (cons (str "[" level "] ") s))))
(defn debug [ & s ]
(when *debug-enabled*
(log "DEBUG" s)))
(defn info [ & s ]
(when *info-enabled*
(log "INFO" s)))
请注意,通过定义动态标志,您可以仅为部分代码*debug-enabled*
打开调试。在这个例子中,假设所有的函数都使用了上面提到的函数。您已设置为 false,但您只想为. 您可以为该调用重新绑定标志,如下所示:(debug)
*debug-enabled*
(my-problematic-func)
(myfunc a b c)
(my-other-func d e f)
(binding [*debug-enabled* true] ; switch on debug for my-problematic-func
(my-problematic-func g h i))