【问题标题】:What is meant by the term "true" object orientation术语“真正的”面向对象是什么意思
【发布时间】:2010-09-19 23:42:04
【问题描述】:

我听说过很多关于 Ruby 甚至可能 Javascript 是“真正的”面向对象的语言,而不是 C++ 和 C#,它们是面向类(或基于模板)的语言。真正的 OO 是什么意思,与类/模板方法相比有什么优势?

【问题讨论】:

    标签: c# ruby oop


    【解决方案1】:

    不确定您对所提供示例的区别。但我知道它不是什么!当 OO 作为事后的想法被固定在一种语言上时,例如Perl 面向对象。

    【讨论】:

      【解决方案2】:

      C++ 问题如下。 C++ 类仅存在于源语法中。没有具有属性和方法的运行时类对象。

      在 Python 中,一切都是对象。一个对象的类是另一个对象,它有自己的方法和属性。 smalltalk 环境也是如此,它是面向对象的一种基准。

      我认为“真正的”面向对象是指一切都是对象的环境。

      [Java 没有做到这一点,因为它有原始类型。]

      【讨论】:

      • 那是错误的。任何语言的面向对象的东西只存在于编程时。在运行时,只是带有简单指令的函数调用以及“胶水代码”让您感觉“动态”或“面向对象”。任何编译器一旦有了程序树,就会开始用机器语言编写没有对象、没有属性、没有方法的代码。只是简单的 cmp、JMP 指令。
      【解决方案3】:

      我认为它可能指的是Prototype Based ProgrammingProgramming Paradigm,其中:

      类不存在,行为重用(在基于类的语言中称为继承)是通过克隆作为原型的现有对象的过程来执行的。这种模型也可以称为无类、面向原型或基于实例的编程。

      另见Ruby singleton methods

      【讨论】:

        【解决方案4】:

        “真”或“纯”面向对象的语言通常是指一切都是一流对象的语言,包括原始类型。例如,在 C++ 和 Java 中,基本类型 int、char 等不是对象。例如,在 Ruby 中,一切都是对象。有时,定义中会隐含附加标准,具体取决于您与谁交谈。

        【讨论】:

          【解决方案5】:

          这是一个用于宣传语言的主观术语。我曾经看到,与 C++ 相比,C# 和 Java 是真正的面向对象语言,因为一切都必须在一个类中(没有全局函数或变量),并且所有对象都继承自一个 Object 类。

          对于 Ruby,它可能是指 Ruby 如何将所有内容都视为对象,因此您可以编写 1.to_s,而不是 str(1)String.valueOf(1)。这是因为 Ruby 不区分值变量和引用变量。在 Javascript 中没有类,您只需创建可以克隆以供重复使用的可扩展对象,这种编程风格被称为 Prototype-based programming

          另一方面,C++ 被宣传为一种多范式语言,它允许您使用多种方法,例如面向对象、通用和过程编程。它不拘泥于一种范式。

          但是,是的,这只是一个主观术语,可能意味着任何事情。通常它指的是该语言是否更强调对象而不是函数、模板等其他语言元素。Wikipedia's article on SmallTalk 称其为“纯”面向对象的语言,该描述也适用于 Ruby:

          Smalltalk 是一种“纯”OO 语言, 这意味着,与 Java 和 C++ 不同, 值之间没有区别 它们是对象和值 原始类型。在 Smalltalk 中, 原始值,例如整数, 布尔值和字符也是 对象,在某种意义上,它们是 对应类的实例, 并且对它们的操作由 发送消息。程序员可以 更改实现的类 原始值,以便新的行为 可以为他们定义 实例——例如,实现 新的控制结构——甚至如此 他们现有的行为将是 改变了。这一事实总结在 常听到的短语“在 Smalltalk 一切都是对象” (更准确地说是 表示为“所有值都是对象”, 因为变量不是)。

          【讨论】:

          • 我想补充一点,无论该语言是否是纯/真正的面向对象的,并不会使该语言比其竞争对手更好或更差。你会发现它通常被宣传为让它变得更好,但这是非常主观的。
          • @he_the_great:是的,但请考虑一种仅遵循一个隐喻/范式的语言比仅混合不同范式的语言更容易理解和学习。因此,如果混合不同的范式不会增加任何表达能力,它只会增加复杂性。例如,Java 原始类型不是对象这一事实只会增加语言的复杂性,而不会增加表达能力。
          【解决方案6】:

          “真正的面向对象”这个术语的另一种解释是,您可以采用一些自身不支持 OOP 的语言,并在其之上坚持一种 OOP 的做事方式。例如,您可以在 C 中对封装进行建模,例如

          typedef struct foo_ {
              T1 (*getA)(foo * self);
              void (*setA)(foo * self, T1 a_);
          
          /* private: */
              T1 a_;
          } foo;
          
          T1 foo_getA(foo * self) {
              return self->a_;
          }
          
          void foo_setA(foo * self, T1 a_) {
              self->a_ = a_;
          }
          
          foo * foo_create() {
              foo * f = malloc(sizeof(foo));
              f->getA = foo_getA;
              f->setA = foo_setA;
              return f;
          }
          
          void foo_destroy(foo * f) {
              free (f);
          }
          
          void doSomething(T1 a) {
              foo * f = foo_create();
              f->setA(f, a);
              foo_destroy(f);
          }
          

          实现继承和多态的技术已经使用了很长时间。一个例子是用作 gtk+ 基础的GObject 框架。

          现在,虽然您可以以面向对象的方式进行编程,但 C 不支持面向对象,而只是允许您在某种程度上模拟它。所以你没有真正的面向对象。看看 C++/Java/C#,你已经支持所有这些类型的东西,比如继承/数据封装和第一手资料。

          【讨论】:

            【解决方案7】:

            C++ 问题如下。 C++ 类仅存在于源语法中。没有具有属性和方法的运行时类对象。

            当然,根据这条规则,在传统的机器架构上没有面向对象编程之类的东西,因为在机器代码级别不存在具有属性和方法的运行时类对象。 (或者,至少,除了像旧的 System/38AS/400 这样的专用架构之外,没有其他的。)

            object oriented”的含义很久以前就被确定为三件事:abstract data typesinheritancepolymorphism。 (链接的维基百科文章在某种程度上混淆了OO的属性和好处。但重要的区别在于OO和“object based”系统。)

            一般来说,“X 不是真正面向对象,不像 Y”真正的意思是“我想卖给你 Y。”

            【讨论】:

            • 在机器级别没有很多东西。但是,主题似乎是关于语言和运行时级别的。
            • 我相信您认为该评论是有道理的并增加了价值,但它让我无法理解。
            • ADT 和对象几乎完全是另一个的补充。请参阅 William Cooks 的 On Understanding Data Abstraction, Revisited,或 Peter Van Roy 的 Programming Paradigms for Dummies
            • 库克的主要问题是,本质上是错误的。对于不成熟的读者来说,这篇论文的问题在于,他提出了“面向对象”的定义,它可能解释为类似于其他人所说的(相当模糊的)“面向对象”一词的含义,但忽略了Cardelli 和 Wegner 论文将对象定义为作为 ADTs+多态性+继承。当心任何人试图告诉你一个公认的定义是错误的:他们正在设置其他东西,比如 1=0 的证明。
            【解决方案8】:

            术语“真正的面向对象”具有相同的含义 作为朴素的术语“面向对象”。

            当将限定词“真实”添加到“手头的主题”时,人们试图提醒读者在当前的话语世界中存在对所述主题的一个或多个“不完全模仿”,它们是可以互换使用,但与主语相比,缺少一个或多个对话语具有重要意义的属性。

            此类使用后通常应附有对主体属性的描述,或对“模仿主体”中缺少的属性的描述,或两者兼而有之;从而引导读者理解,或者至少思考一下区别。

            创造这个短语的人使用的面向对象似乎包括以下属性:

            • 将(数据 + 行为)封装到(对象)中,仅通过(消息)进行通信。
            • 自动回收用于表示(对象)的内存,
              当所说的(对象)不再被引用时。
            • 将(意义)延迟绑定到对象的(表示)上。
            • 从(对象)到(对象的属性)的运行时反射。

            实践和经验告诉我们,
            必要时,包括

            • 闭包 (有时称为“真正的闭包”,
              正式意义上的意思(闭包),
              并遵循 (lisp) 中的闭包示例。
              )

            【讨论】:

            • 据我所知,闭包和对象是两种可供选择的编程方式(词法绑定与动态调度):一些语言提供前者,一些提供后者,一些提供两者。但是闭包是面向对象的另一种方法,它们不是它的一部分。
            猜你喜欢
            • 2010-12-17
            • 1970-01-01
            • 2021-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多