斯卡拉可以被视为"抽象倒置"吗?

Alo*_*ard 3 oop abstraction programming-languages functional-programming scala

问候,

这是一个具有挑衅性的问题,旨在公开讨论如何在开发者社区中看到抽象反转.我很想知道你的想法.

首先,这里引用维基百科给出的抽象反转例子:http: //en.wikipedia.org/wiki/Abstraction_inversion

在诸如Java和C++之类的面向对象语言中创建表示函数的对象是很麻烦的,其中函数不是第一类对象.在C++中,可以通过重载()运算符来使对象"可调用",但是仍然经常需要实现一个新类,例如STL中的Functors.

对我来说,函数是Scala中的一等公民,但是当我们使用Scala生成Java字节码时,Scala会在Java上创建特定的类'以使函数式编程成为可能...... 我们可以将其视为抽象反转吗?

同样可以应用于Clojure或JVM的任何功能语言......甚至是Apache Collections,例如:

http://commons.apache.org/collections/apidocs/org/apache/commons/collections/Closure.html


顺便说一句,我不相信维基百科文章的客观性.例如,当谈到微内核中可能的抽象反转时,文章说"一个观点主体认为微内核设计是一个抽象反转",但在OOP中没有这样的函数类型声明.

Dan*_*ral 9

维基文章真的很弱(它代表了一个抽象反转本身吗?:),这个概念有点可疑.但它的基本要点似乎是抽象隐藏了一些基本元素,迫使该抽象的用户重新实现它.

例如,从谈话页面来看,这是一个更有趣的例子.假设一个CPU有一个tan数学函数,但没有sincos和编程语言实现sin,并cos在以下方面tan,但没有暴露tan自己.使用该语言的程序员将被迫实现tan,sin并且cos,它们本身是以实现的方式实现的tan,因此表征抽象反转.

所以,回到Scala.当然,在Scala中使用函数的程序员不会引发抽象反转,因为他没有被迫重新实现作为Scala的原语可用的功能.

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

  1. JVM必须有一个"函数"原语.
  2. 这样的原语必须提供替代Scala正在做的事情.

究竟是什么功能?函数原语会是什么样的?在此上下文中,"功能"表示能够执行的数据.有人可能会说,所有汇编代码实际上都是能够执行的数据 - 只有它不可移植,而且,不再是字节码,因此不符合设计原则.

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

所以,我认为可以为1做一个案例.让我们继续下一步.

如果Java 确实提供了"方法"数据类型,那么Scala函数是否会不再是类的实例?不,他们不会.Scala的一个基本设计方面是正在运行的程序的每个元素都是一个对象.在"原始人"是的Java已经呈现就好像它们是与方法正常对象,如果有一个"方法"原始的,所以将它.

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


Kev*_*ght 5

通过对象实现一个函数不仅仅是因为这是JVM上的可能,它切入了Scala的基本原理.

一切都是一个对象:函数,参与者,数字文字等.任何对象都可以应用(通过定义apply()方法),而不是实际上是FunctionN的子类.

这种二元性在许多标准库API的设计中是基础,它允许例如将Maps视为函数(映射键到值)和作为对象(键/值对的集合).

Scala是一个真正的对象/功能混合体,两种范式都不占优势.