你好,
这是一个挑衅性的问题,旨在就开发人员社区如何看待抽象反转展开辩论。我真的很想知道你的想法。
首先,这里引用维基百科给出的抽象反转示例:
http://en.wikipedia.org/wiki/Abstraction_inversion
Creating an object to represent a function is cumbersome in object-oriented languages such as Java and C++, in which functions are not first-class objects. In C++ it is possible to make an object 'callable' by overloading the () operator, but it is still often necessary to implement a new class, such as the Functors in the STL.
对我来说,函数是 Scala 中的一等公民,但是当我们使用 Scala 生成 Java 字节码时,Scala 在 Java 的“顶部”创建了特定的类,使函数式编程成为可能... 我们可以将其视为抽象反转吗?
同样可以应用于 Clojure 或任何用于 JVM 的函数式语言……甚至 Apache 集合,例如:
http://commons.apache.org/collections/apidocs/org/apache/commons/collections/Closure.html
顺便说一句,我不相信维基百科文章的客观性。例如,当谈到微内核中可能的抽象反转时,文章说“一种观点认为微内核设计是一种抽象反转”,但在 OOP 中没有这样的功能类型声明
最佳答案
wiki 文章真的很弱(它本身是否代表抽象反转?:),而且这个概念有点可疑。但它的基本要点似乎是抽象隐藏了一些基本元素,迫使该抽象的用户重新实现它。
例如,来自讨论页的一个更有趣的例子。假设一个 CPU 有一个 tan
数学函数,但没有 sin
或 cos
,以及一种实现的编程语言 sin
和 cos
在 tan
方面,但没有暴露tan
本身。使用该语言的程序员将被迫实现 tan
在 sin
方面和 cos
,它们本身是根据 tan
实现的,因此表征抽象反转。
所以,回到 Scala。自然地,在 Scala 中使用函数的程序员不会招致抽象反转,因为他不会被迫重新实现作为 Scala 原语可用的功能。
另一方面,人们可能会声称 Scala 将函数实现为类实例是抽象反转的实例。然而,要做到这一点,还有两件事必须成立:
究竟什么是函数?函数原语会是什么样子?在这种情况下,“功能”是指能够被执行的数据。有人可能会说,所有汇编代码实际上都是可以执行的数据——只是它不可移植,而且不是字节码,因此不符合设计原则。
另一方面,Java 中的所有方法都由一个标识符引用,Java 通过标识符定位要为给定对象的类层次结构执行的代码。此标识符未公开,但可以通过反射间接使用。如果它被公开,并且提供了一些功能来说“调用此代码”,那么可以说是围绕它构建了一个函数。
所以,我认为可以证明 1 为真。让我们继续下一个。
如果 Java 确实提供了“方法”数据类型,Scala 函数会不再是类的实例吗?不,他们不会。 Scala 的基本设计方面之一是运行程序的每个元素都是一个对象。 Java 已经拥有的“原语”就好像它们是带有方法的普通对象一样,如果有一个“方法”原语,它也会如此。
方法原语的一个可能结果是将方法提升为一等公民,但函数本身几乎不会改变。
关于oop - Scala 可以被视为 'Abstraction Inversion' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4194800/