【问题标题】:Is clojure.lang really just implementation details?clojure.lang 真的只是实现细节吗?
【发布时间】:2016-02-24 01:02:44
【问题描述】:

在 Clojure 中,某些任务(例如实例化 PersistentQueue 或使用 deftype 来实现与 clojure.core 函数兼容的自定义数据类型)需要了解 clojure.lang 中的类和/或接口.

但是,根据clojure.lang/package.html

唯一被视为公共 API 一部分的类是 clojure.lang.IFn。所有其他类都应该被视为实现细节。

这些陈述是错误的还是过时的?如果是这样,是否有计划在未来纠正它们?如果没有,是否有更优选的方式来执行上述任务,或者根本不应该在惯用的 Clojure 代码中完成?

【问题讨论】:

  • clojure.lang 的成员被视为实现细节并不意味着您不能引用它们。相反,它只是意味着你不应该期望这样的代码是可移植的(例如,你可能需要 Clojure 和 ClojureScript 的单独代码)。
  • @DaoWen clojure.lang 被视为实现细节意味着不仅仅是代码不可移植。从最严格的意义上讲,只要公共接口保持不变,实现细节就可以随时更改。不过clojure.lang 并没有那么激进。

标签: clojure implementation leaky-abstraction


【解决方案1】:

Alex Miller 过去对此有过commented(尽管整个帖子都值得一读):

我想说 Clojure 的内部存在一系列“公共”特性。

  • 新的 Clojure API (clojure.java.api.Clojure) 是 Clojure 外部调用者的官方公共 API。该 API 基本上包含解析变量和调用函数的方法。
  • 对于 Clojure 中的 Clojure 用户,几乎所有公开且具有文档字符串并显示在 api 文档中的 var 都可以视为公共 API。
  • 私有的或没有文档字符串的 Clojure 变量(因此公共 api 文档中省略了该变量)可能需要非常小心。
  • Clojure 内部 Java 接口 [clojure.lang] 无疑是为了让库构建者创建在 Clojure 世界中发挥作用的有用东西。我不知道是否有人说过它们是“公开的”,但我当然认为对可能破坏外部用户的核心界面的任何更改都会被非常谨慎地考虑。
  • 在大多数情况下,Clojure 内部 Java 类 [clojure.lang] 应被视为私有的,如有更改,恕不另行通知。那里也有灰色地带。

一般来说,我们不会高度重视封装或隐藏内部结构。在大多数情况下,如果内部组件可能对高级用户做有趣的事情有用,它们会保留可用,但需要注意的是,您做的事情越奇怪,您在未来版本中被意外破坏的可能性就越大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多