重构Clojure函数不在文件中

时间:2016-06-20 02:54:49

标签: clojure namespaces refactoring

鉴于每个Clojure名称空间对应一个文件,是不是在不破坏向后兼容性的情况下永远不能将公共函数,宏等移出该文件?

这似乎是一个令人惊讶的严格系统 - 实际上,重构面向公众的代码只能在一个文件中完成。

此限制是否存在技术原因?可能与Java互操作有关吗?

2 个答案:

答案 0 :(得分:1)

您可以将单个命名空间拆分为多个文件(请参阅Splitting a Clojure namespace over multiple files),但这样做很少见。您也可以使用https://github.com/ztellman/potemkin导入变量,但在实践中很少这样做。 Clojure库往往具有相对较小的公共接口,可能是因为它们通常在公共数据结构上运行。因此,很少有文件包含很多代码。

如果您想保留向后兼容性,可以def将var变为命名空间(甚至在具有不同名称的命名空间内),以确保任何调用者仍然可以解析为正确的函数。 / p>

答案 1 :(得分:1)

不被视为公共API的一部分的函数可以标记为私有,这样可以在不破坏调用代码的情况下进行后续重构。当然,对公共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)