当我通读 stackoverflow 的答案和问题时,我得到的印象是 OO 被划分为本质上是命令式的。

但是,OO 不就是一种将代码和数据划分为现实世界对象的方法吗?

如果是这样,为什么要放弃其他较低级别的范例来在这样的平台上工作?

IOW,默认情况下不可变的基于对象的泛型类型系统将是函数式第一语言的工作方式,默认情况下可变的基于对象的泛型类型系统将是命令式语言的世界。

或者我完全错过了一些东西?

有帮助吗?

解决方案

. 。OO 和命令式是两个正交的概念。

例如:

  • Common Lisp 对象系统是 Lisp OO 的一个示例,并且可能是最复杂的对象系统。
  • OCaml 是一种函数式语言,具有支持面向对象组织的对象系统和模块系统
  • Scala 是一种函数式语言,具有非常灵活的 OO 系统
  • Haskell 允许您使用更高级的多态性编写面向对象的代码

面向对象有很多不同的方法。

其他提示

大多数面向对象的语言是必要的,但你的可以的使用它们以某种实用的风格。一些功能性的语言坐顶上的OO框架(F#.NET上是最明显的例子),以获得使用适当大规模的框架交易掉一些“纯度”。

我觉得有一个的很多的余地“主要面向对象”的语言做更多,以帮助在功能的编程风格 - 为永恒更好的支持而最明显的特征,可能还跟着更好的类型推断。 (至少在谈论C#,这可能是一个传统的语言试图让在功能车门一英尺的最显著例如当。)

面向对象是编程的风格,其允许程序员来表达的程序为一组作用和相互作用(通常,借助于状态的对象的消息传递中动态类型语言和方法,调用在静态类型语言中),并且以特定的顺序这样做。

状态,动作和顺序从程序编程概念,并且不存在于nonmonadic功能的编程(单子被用于实现在纯功能语言Haskell中,否则它不会有这些概念的状态,操作和序列)。

要看看它从不同的角度,大多数人都喜欢势在必行认为(而不是递归或RPN)。从此得出,大多数语言将是必要的。

当然,很多问题都与非必要的方法(例如用户界面)更简单的表达(或解决),但大多数人并不真正感到舒服了这种方法。有些人不喜欢离开常走的道路,而其他真正有麻烦做从这个方面处理问题所必需的心理变化(思维方法调用和递归而不是变量和循环)。

我仍然坚信面向对象是一种固有的必要的概念。然而,作为一个最近的问题让我想一般的编程模式更多一些,我放在一起一个更全面的答案,这是有点偏离主题,但也顺带回答您的问题:

在2个主要的编程范式是的的声明范例的,那里的程序员写下的抽象关系(因此告诉编译器的 的他想要什么),和势在必行范例的,那里的程序员写下算法(从而告诉计算机的如何的得到他想要的东西)。

在范式是先验的语言无关 - 这是你如何思考和构建程序更多的方法。不过,也有一种语言多么容易使得它使用一种范式的差异:语言语法和语义导致编写代码的习惯的方法

用于声明性语言的一个例子是Prolog的,用于命令式语言将是Fortran的一个例子(和真正的程序员可以编写任何语言FORTRAN程序)。

作为代码的一个例子,其是命令性和声明的同时,可以考虑在此Perl6实施Fibonnaci序列的:

my @fibonacci-sequence := 0, 1, * + * ... *;

这显然是该序列的声明性描述。然而,随着*...有效Perl6运营商 - 无论该星可用于创建拉姆达表达式,序列运算符,以创建惰性列表 - 这也是一个必要的语句中调用运行时固有的代码

让我们考虑一些其他编程范例,特别是功能性和面向对象的编程。

官能范例本质上是说明性的,因为它的模型计算作为集之间的关系。

面向对象的范例本质上是必要的,因为它的模型计算为有状态的对象之间的通信,被称为消息传递。

有些语言是纯粹的,这意味着所有的计算符合范式。例如,Haskell是纯功能语言,和Smalltalk是一个纯粹的面向对象的语言。

然而,这并不意味着该函数式语言RESP。面向对象的语言防止势在必行RESP。声明式编程。在实践中,你经常使用的功能势在必行 - 你把一个输入值脱身的输出值。反过来对面向对象编程成立:一个对象接受消息集声明它的接口

有些人不同意面向对象是一个命令式概念,所以这是我的推理。

面向对象要点:

  1. 对象保存状态(即对其他对象的引用)
  2. 对象接收(并处理)消息
  3. 处理消息可能会导致
    • 消息被发送到对象本身或其他对象
    • 对象状态的改变

这意味着面向对象编程需要可变状态 由物体持有(!). 。如果您通过创建一系列对象来模拟状态变化,那么您就会破坏这些不变量,就这么简单。

火焰诱饵: 如果您不同意面向对象的定义,请向 Alan Kay 提出。

许多不同的概念都促成了面向对象编程的概念。 维基百科 列出了其中的大多数。

我将通过使用以下内容来描述 OOP 的本质: 有行为的对象.

维基百科描述了 对象 由以下三个属性决定:

  1. 身份:一个对象区别于其他对象的属性
  2. 状态:描述对象中存储的数据
  3. 行为:描述对象接口中可以使用该对象的方法

很多面向对象语言都有类的概念,但实际上,也有 基于原型的语言 就像 JavaScript 一样。

函数式语言也可以使用类(例如Haskell 中的类型类)。但仅仅因为它们有类并不意味着它们是面向对象的或允许面向对象编程。继续以 Haskell 为例:你甚至没有对象!不存在“身份”这个概念!你所能做的就是组合纯函数!

仅仅因为有人使用名为“类”的术语,并不意味着他们正在进行面向对象编程!

OOP 是关于具有行为的有状态对象。尽管对象的行为不必修改该对象,因为可以创建新对象,但您将完全不再需要对象。您不再需要身份,因为对一个对象的更改是否由对同一对象的其他引用反映并不重要,因为不再有任何更改。您所需要的只是用于数据隐藏和封装的值(没有身份)和模块和/或类。

所以 是的, ,命令式编程是 OOP 所固有的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top