请在 2024 年 Clojure 状态调查! 分享您的想法。

欢迎!请参阅 关于 页面以了解有关此方法的更多信息。

+1
tools.namespace

我们必须需要带有副作用(如 multimethod 或协议实现)的命名空间。
因此,一个基本命名空间中有很多嘈杂的 require 形式。

使用 tools.namespace 来 require 所有的应用程序命名空间是否更好?

1 个答案

+2

被选中
 
最佳答案

正如所问:"通过 tools.namespace 需要所有应用程序命名空间是通常做法吗?"

绝对不是“通常”的做法。

将 multimethod/protocol 实现分散到太多不使用这些 multimethods/protocols 的代码需要的命名空间中,以致于它们的 require 列表尤其“嘈杂”,这并不特别常见。

tools.deps 在命名空间中分散了一些提供者实现,但它要求所有内置实现都在库使用者的“入口点”命名空间中。请参阅 https://github.com/clojure/tools.deps.alpha/blob/860bc7e3e310380b3baf9b43b05d343f3ae812f6/src/main/clojure/clojure/tools/deps/alpha.clj#L17-L22 —— 我不知道你是否会把这看作是“嘈杂”?

如果您确实有许多不是其他代码可能需要的实现命名空间,因此需要在一开始启动时加载,那么我会首先考虑创建一个临时命名空间来执行此要求,然后在您的初始命名空间中只要求这个临时命名空间。

如果这仍然觉得有些杂乱,我可能会考虑使用 tools.namespace 自动查找和加载实现命名空间,假设它们遵循合适的模式。但截至到目前为止的八年生产Clojure经验,我从未遇到这种需求。

...