从文件中重构 Clojure 函数

Refactoring Clojure function out of file

鉴于每个 Clojure 命名空间都对应一个文件,难道 public 函数、宏等永远不能在不破坏向后兼容性的情况下移出该文件吗?

这似乎是一个非常严格的系统——本质上,面向 public 的代码的重构只能在单个文件中完成。

此限制是否有技术原因?也许与 Java 互操作有关?

您可以将单个名称空间拆分为多个文件(请参阅 Splitting a Clojure namespace over multiple files ) but it is quite rare to do so. Also you can import-vars using https://github.com/ztellman/potemkin,但在实践中同样很少这样做。Clojure 库往往具有相对较小的 public 接口,这可能是因为它们通常在常见的数据结构。因此很少有包含大量代码的文件。

如果您想保持向后兼容性,您可以 def 将 var 放入命名空间(或者甚至在具有不同名称的命名空间中),以确保任何调用者仍将解析为正确的函数.

不属于 public api 的函数可以标记为私有,这为以后在不破坏调用代码的情况下进行重构留下了机会。当然,对 public api 的任何更改都会有破坏向后兼容性的风险,并且会在破坏性更改和引入具有冗余功能的新 api 之间进行权衡。

(ns foo)

;; only visible in the foo ns
(defn- a-private-fn [] ...)

;; only visible in the foo ns
(def ^:private a-private-var BAR 1)