关于名称空间:从文件中重构Clojure函数

Refactoring Clojure function out of file

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

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

存在此限制的技术原因吗?

与Java互操作有关吗?


不被视为公共api一部分的功能可以标记为私有,这为以后的重构提供了机会,而又不会破坏调用代码。当然,对公共api进行的任何更改都可能会破坏向后兼容性,并且在该重大更改与引入具有冗余功能的新api之间进行权衡。

1
2
3
4
5
6
7
(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)

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

如果要保留向后兼容性,可以将var def放入命名空间(甚至在具有不同名称的命名空间内),以确保所有调用方仍可以解析为正确的函数。