【问题标题】:Why does the Clojure core library use concrete derivation?为什么 Clojure 核心库使用具体派生?
【发布时间】:2015-11-18 20:04:15
【问题描述】:

documentation of Clojure's type mechanisms中声明

  • 具体推导不好
    • 不能从具体类派生数据类型,只能从接口派生

但是,一些core Clojure classes 使用具体派生(还有其他示例,但这些是超类是clojure.lang 一部分的唯一情况):

  • ARef 扩展 AReference
  • Agent 扩展 ARef
  • Atom 扩展 ARef
  • Namespace 扩展 AReference
  • Ref 扩展 ARef
  • Var 扩展 ARef

此外,还有很多个抽象类。但是,没有办法在 Clojure 中创建等效的抽象类,而且对我来说,抽象类的扩展似乎与常规的具体派生具有所有相同的缺点。

为什么在这里使用具体的推导?

【问题讨论】:

  • 同一页面还警告不要进行可变性和封装,但 clojure.lang 中的类包含大量可变的私有字段。不要将语言的内部实现细节与它的用途混淆。
  • @Alex 我关心的唯一原因是 clojure.lang 中的接口扩展是在 Clojure 中实现与clojure.core。如果该包中的所有内容都只是实现细节,那么此类扩展不需要了解其工作原理。

标签: inheritance clojure


【解决方案1】:

在谈到哲学的东西时,我觉得自己不够权威,但这是我的两分钱。

您引用的文字出现在此处的原因是警告滥用defrecorddeftype。 Clojure 不鼓励将记录/类型公开为 API。相反,应该尽可能公开接口。毕竟,OO 语言公开了类,而 FP 语言公开了函数/方法/接口。

另一方面,您提到 clojure 的实现本身使用抽象类并继承它们。我宁愿将这些视为“某人必须做的肮脏工作”。 JVM 的设计使其在 OO 世界中的原语上最有效。 OO 世界虚拟机和 FP 世界语言之间的差距必须有人来填补。

【讨论】:

  • 这是有道理的,但我需要看到更多支持你的论点,以相信在这里使用抽象类只是一种“必要的邪恶”,并且没有 JVM 的性能特征,将不如使用纯接口。看来 Rich Hickey 在这里有一个非常深思熟虑的原因。
猜你喜欢
  • 2016-08-18
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
相关资源
最近更新 更多