我在很多地方都看过这个:
“在一个数据结构上运行100个函数比在10个数据结构上运行10个函数更好。” -Alan Perlis
但我从未见过它解释了为什么这应该是真的。您是否应该尝试从第一个派生其他9个数据结构以避免重复数据?我觉得我错过了一些背景。
答案 0 :(得分:80)
引用来自1982年出版的Alan Perlis'Epigrams on Programming。
这句话的含义很好地体现在Lisp中,其中有许多功能可以操作和专门处理列表,你可以用列表来完成很多工作。在列表上运行的各种功能,使它们比任何单一用途的数据结构更强大。
Lua,另一个例子是uses tables to simulate classes。为什么使用表来创建对象而不是创建语言级类和面向对象语言之类的对象呢?由于您的对象现在是一个表,您可以免费使用对象上为表定义的任意数量的函数!更好的是,我们不必使用特定于类的语法来混淆语言,并且必须从我们想要的类中重新定义表中的函数。
Perlis所说的绝对是Lisp和functional programming中一种突出的思维方式。您的一个数据结构上的这100个函数可以通过许多独特的方式组合在一起,因为它们都在相同的数据结构上运行,但您不能真正将这10个函数混合在10个数据结构上,因为它们仅被定义研究他们的特定数据结构。
更现代,更简单的变体就是抽象。如果我们使用Java编写代码,您是想在List接口上编写100个函数,还是在同一组函数中编写100个函数,一次用于ArrayList,一次用于LinkedList,一次用于....
答案 1 :(得分:8)
计算机程序的结构和解释(SICP)回答您的问题如下:
您可以看到online version of the book here
的原始内容编辑(包括在评论中):
“在Pascal中,过多的可声明数据结构导致了函数内的特化。”专业化很糟糕,因为它会用我自己的话来抑制“偶然性”/创造力 - 我会说 - 。
换句话说,如果函数太特殊,那么它们就不能以函数创建时未知的方式重用。
很好的例子是fold
(https://hackage.haskell.org/package/base-4.8.1.0/docs/Data-Foldable.html),它是一种与数据结构无关的通用高阶函数。它可以在树上使用,例如
data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a).