【问题标题】:Refactoring Clojure function out of file从文件中重构 Clojure 函数
【发布时间】:2016-10-21 04:59:31
【问题描述】:

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

这似乎是一个令人惊讶的僵化系统——本质上,重构面向公众的代码只能在单个文件中完成。

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

【问题讨论】:

  • 如何在 Java BTW 中“将函数/方法移出文件/类而不破坏向后兼容性”
  • @Davyzhu 说了什么。我很难看出这有什么意义,以及它与其他编程语言有何不同。

标签: clojure namespaces refactoring


【解决方案1】:

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

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

【讨论】:

  • 我明白了,因此将单个命名空间拆分为多个文件是可能的,但并不常见。好吧,这至少将代码的抽象层次结构从文件的物理介质中解放出来。
【解决方案2】:

不被视为公共 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    相关资源
    最近更新 更多