0

语境:

(A) “在一个数据结构上运行 100 个函数比在 10 个数据结构上运行 10 个函数要好。” ——艾伦·佩利斯

(B) Clojure 有 defProtocol、defRecord、defType

问题:

是否有某种风格的 Clojure 编程风格可以同时获得两者的好处?

(B) 具有避免类型错误的优点。

(A) 具有避免重复代码的优点。

谢谢

PS:我很想听到关于我为什么被否决的建设性批评+如何重组问题以使其富有成效。

4

2 回答 2

1

我不确定您如何将 (A) 和 (B) 关联起来。

(A) 是关于具有一致性,即如果您使用相同的数据结构来表示跨应用程序的各个层的数据(例如:存储在地图中的用户信息),那么它将使事情保持一致。如果您使用许多数据结构来表示相同的信息,那么您将不得不编写代码来将结构从一种形式转换为另一种形式,并且在不同结构上工作的各种函数将无法组合,因为它们期望不同的数据结构。

(B) 这是关于 Clojure 中的各种构造的。

defprotocol:这与数据结构无关,而是与合同/接口有关,即特定类型实现了合同,并且该类型可以在消费者函数需要传递的类型来实现合同的任何上下文中使用。例如:任何可以打印到控制台(或其他可写字符串)的类型都将实现打印合同/协议。

defrecord:创建地图,但以默认方式实现了一些附加接口。

deftype:创建类型的低级构造,因此您必须为此编写大量代码。99% 的时间你不需要使用它。

于 2012-07-09T04:15:18.713 回答
0

调和这一点的方法是考虑“抽象”而不是“数据类型”。或者用 Alan Perlis 的话说:

“在一个抽象上运行 100 个函数比在 10 个抽象上运行 10 个函数要好。”

所以 Clojure 的方法是:

  • 以简单、最小的方式定义你的抽象(使用 defprotocol)
  • 针对这个抽象编写函数
  • 使用 defprotocol、deftype 等定义实现抽象的具体类型(如果您愿意,也可以使用 extend-protocol 将协议扩展到现有的 Java 类)
于 2012-07-09T12:06:52.313 回答