代码之家  ›  专栏  ›  技术社区  ›  DouglasH

困惑的OO是固有的命令性还是多范式?

  •  3
  • DouglasH  · 技术社区  · 17 年前

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

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

    还是我完全错过了什么?

    7 回复  |  直到 17 年前
        1
  •  14
  •   user21714    17 年前

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

    例如:

    • Scala是一种具有非常灵活的OO系统的函数式语言
    • Haskell允许您使用更高级的多态性编写面向对象的代码

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

        2
  •  6
  •   Jon Skeet    17 年前

    大多数OO语言都是命令式的,但是 以某种功能性的方式使用它们。一些函数式语言位于OO框架之上(最明显的例子是.NET上的F#on),为了得到一个大规模的框架以在适当的地方使用,它们牺牲了一些“纯度”。

    “主要是OO”语言有更多的空间来帮助函数式编程——更好地支持不变性是最明显的特性,其次可能是更好的类型推断。(至少在谈论C#时是这样,这可能是传统语言试图进入功能门的最重要的例子。)

        3
  •  4
  •   yfeldblum    17 年前

        4
  •  2
  •   Aaron Digulla    17 年前

        5
  •  2
  •   Community Mohan Dere    9 年前

    我仍然坚信面向对象是一个固有的必要概念。但是作为一个 recent question 为了让我对编程范式有更多的思考,我总结了一个更全面的答案,这有点离题,但顺便也回答了您的问题:

    两种主要的编程范例是 陈述范式 ,程序员写下抽象关系(从而告诉编译器 什么 ,程序员写下算法(从而告诉计算机 怎样 得到他想要的东西)。

    范例是一种先验的语言不可知论——它更多的是关于你如何思考和构造你的程序的一种方式。然而,语言使用范例的容易程度存在差异:语言语义和语法导致了编写代码的惯用方式。

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

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

    这显然是对序列的声明性描述。但是, * ... 是有效的Perl6运算符-可以使用任意星创建lambda表达式,使用序列运算符创建惰性列表-它也是调用运行时内在代码的命令语句。

    这个 功能范式

    这个 面向对象范式 本质上是必需的,因为它将计算建模为有状态对象之间的通信,称为消息传递。

    有些语言是纯粹的,这意味着所有的计算都符合范式。例如,Haskell是一种纯粹的函数式语言,Smalltalk是一种纯粹的面向对象语言。

        6
  •  0
  •   Christoph    17 年前

    面向对象要素:

    1. 对象保持状态(即对其他对象的引用)
    2. 对象接收(和处理)消息
      • 发送到对象本身或其他对象的消息
      • 对象状态的变化

    . 如果您通过创建一系列对象来模拟状态变化,那么您正在破坏这些不变量,就这么简单。

    如果你不同意这个面向对象的定义,请与Alan Kay讨论。

        7
  •  0
  •   Thomas Danecker    16 年前

    Wikipedia 列出了其中的大部分。

    我将通过使用 Objects with Behaviours

    维基百科的特点 物体

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

    很多面向对象语言都有类的概念,但实际上,也有 Prototype-based languages 比如JavaScript。

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

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

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