oop - Scala 可以被视为 'Abstraction Inversion' 吗?

标签 oop scala programming-languages functional-programming abstraction

你好,

这是一个挑衅性的问题,旨在就开发人员社区如何看待抽象反转展开辩论。我真的很想知道你的想法。

首先,这里引用维基百科给出的抽象反转示例:
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数学函数,但没有 sincos ,以及一种实现的编程语言 sincostan 方面,但没有暴露tan本身。使用该语言的程序员将被迫实现 tansin 方面和 cos ,它们本身是根据 tan 实现的,因此表征抽象反转。

所以,回到 Scala。自然地,在 Scala 中使用函数的程序员不会招致抽象反转,因为他不会被迫重新实现作为 Scala 原语可用的功能。

另一方面,人们可能会声称 Scala 将函数实现为类实例是抽象反转的实例。然而,要做到这一点,还有两件事必须成立:

  • 必须有一个可用于 JVM 的“函数”原语。
  • 这样的原语必须为 Scala 正在做的事情提供了一种替代方案。

  • 究竟什么是函数?函数原语会是什么样子?在这种情况下,“功能”是指能够被执行的数据。有人可能会说,所有汇编代码实际上都是可以执行的数据——只是它不可移植,而且不是字节码,因此不符合设计原则。

    另一方面,Java 中的所有方法都由一个标识符引用,Java 通过标识符定位要为给定对象的类层次结构执行的代码。此标识符未公开,但可以通过反射间接使用。如果它被公开,并且提供了一些功能来说“调用此代码”,那么可以说是围绕它构建了一个函数。

    所以,我认为可以证明 1 为真。让我们继续下一个。

    如果 Java 确实提供了“方法”数据类型,Scala 函数会不再是类的实例吗?不,他们不会。 Scala 的基本设计方面之一是运行程序的每个元素都是一个对象。 Java 已经拥有的“原语”就好像它们是带有方法的普通对象一样,如果有一个“方法”原语,它也会如此。

    方法原语的一个可能结果是将方法提升为一等公民,但函数本身几乎不会改变。

    关于oop - Scala 可以被视为 'Abstraction Inversion' 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4194800/

    相关文章:

    ruby - 我是否正确理解了 Ruby 中的对象?

    c++ - 未封装意味着不可更改?

    scala - 如何使用 Scala-native 构建静态链接的可执行文件?

    java - Mockito:尚未定义但知道返回类型的模拟方法

    programming-languages - 适合工作的语言

    javascript - 设置间隔() : How to stop then start itself again?

    oop - 膨胀的 bool 返回函数

    scala - 替换 Scala 中的 if-without-else

    c++ - 当一种语言是另一种语言的平行超集时,这意味着什么?

    programming-languages - 谁决定将哪些功能纳入语言?