从文件中重构Clojure函数

从文件中重构Clojure函数,clojure,namespaces,refactoring,Clojure,Namespaces,Refactoring,假设每个Clojure名称空间对应一个文件,那么在不破坏向后兼容性的情况下,公共函数、宏等不可能移出该文件吗 这似乎是一个异常严格的系统——本质上,面向公众代码的重构只能在单个文件中完成 这种限制有技术原因吗?可能与Java互操作有关?您可以将一个名称空间拆分为多个文件(请参阅),但这样做非常罕见。您还可以使用导入变量,但在实践中很少这样做。Clojure库往往具有相对较小的公共接口,可能是因为它们通常在公共数据结构上运行。因此,很少有包含大量代码的文件 如果您想保持向后兼容性,可以将var插入

假设每个Clojure名称空间对应一个文件,那么在不破坏向后兼容性的情况下,公共函数、宏等不可能移出该文件吗

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


这种限制有技术原因吗?可能与Java互操作有关?

您可以将一个名称空间拆分为多个文件(请参阅),但这样做非常罕见。您还可以使用导入变量,但在实践中很少这样做。Clojure库往往具有相对较小的公共接口,可能是因为它们通常在公共数据结构上运行。因此,很少有包含大量代码的文件


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

不属于公共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)

在javabtwhat@Davyzhu中,如何“在不破坏向后兼容性的情况下将函数/方法移出文件/类”。我很难理解这一点的重要性以及它与其他编程语言的区别。我明白了,所以将一个名称空间拆分为多个文件是可能的,但并不常见。好吧,这至少释放了抽象层次的代码drom的物理介质的文件。