在 Clojure 中,一些任务(例如实例化PersistentQueue https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/PersistentQueue.java或使用deftype
实现与以下兼容的自定义数据类型clojure.core
函数)需要了解其中的类和/或接口clojure.lang https://github.com/clojure/clojure/tree/master/src/jvm/clojure/lang.
然而,根据clojure.lang/package.html https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/package.html:
唯一被视为公共 API 一部分的类是clojure.lang.IFn https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/IFn.java。所有其他类都应考虑实现细节。
这些说法是否不正确或过时?如果有,未来有计划纠正吗?如果没有,是否有更优选的方法来执行上述任务,或者根本不应该在惯用的 Clojure 代码中完成这些任务?
亚历克斯·米勒有评论了 https://groups.google.com/d/msg/clojure/2ZHYa-Bv8UU/31c7b6JaCd4J过去曾对此进行过讨论(尽管整个线程值得一读):
我想说 Clojure 的内部存在一系列“公共”性。
- 新的 Clojure API (clojure.java.api.Clojure) 是供 Clojure 外部调用者使用的官方公共 API。该 API 基本上由解析变量和调用函数的方法组成。
- 对于 Clojure 中的 Clojure 用户来说,几乎任何公开且具有文档字符串并显示在 api 文档中的 var 都可以被视为公共 API。
- 私有或没有文档字符串的 Clojure 变量(例如公共 api 文档中省略了 var)可能是需要非常小心的地方。
- Clojure 内部 Java 接口 [
clojure.lang
] 当然是为了让库构建者能够创建在 Clojure 世界中发挥作用的有用的东西。我不知道有人曾经说过它们是“公共的”,但我当然认为对可能破坏外部用户的核心界面的任何更改都会被非常仔细地考虑。
- Clojure 内部 Java 类 [
clojure.lang
] 在大多数情况下应被视为私有,如有更改,恕不另行通知。即使那里也存在灰色地带。
一般来说,我们并不高度重视封装或隐藏内部结构。在大多数情况下,如果内部结构可能对高级用户做有趣的事情有用,那么它们就可以使用,但需要注意的是,你做的事情越奇怪,在未来的版本中就越有可能被意外破坏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)