面向对象编程:为什么要“面向对象”?


14

我大部分时间都在学习游戏编程学位。这不是计算机科学学位,因此避开了许多理论,以建立实用的档案袋以及我认为的JIT学习,这显然在游戏行业中更为重要。第一个主题是“面向对象编程简介”。

直到我了解了不同的编程范例(我从https://en.wikipedia.org/wiki/Comparison_of_programming_paradigms获得此列表)后,该短语才使我感到困扰:

  • 势在必行
  • 功能性
  • 程序
  • 结构化的
  • 事件驱动
  • 面向对象
  • 陈述式
  • 基于自动机

我知道这并不是一个详尽无遗的清单,并不是所有这些概念都是平等的,而且它们中的大多数甚至都不是排他性的,但是我不明白为什么其中大多数只用一个词-必要;功能 声明-但是当我们谈论使用对象编程中,我们必须澄清,我们面向围绕这些对象。我们不能只使用对象吗?我们就不能对象吗?他们为什么要把我们定位为我们的指导明星?

在这里(https://en.wikipedia.org/wiki/Object-iented_programming),无处使用“定向”一词作为自己的术语。仅解释“对象”。

另外,出于实际原因,我可以看到使用事件驱动的原因,因为事件编程已经是您在运行会议时要做的事情,而自动机编程听起来就像您正在建立机器人生产线,因此,在此处添加其他澄清词会有所帮助。

是什么使“对象编程”作为一个短语不足以描述我们在编程中使用对象时所做的事情?

显然,从我的语气来看,我不太喜欢“面向”一词。这让我想起了我当法院记者的经历,是在律师使用“与……有关”这一短语作为一种口头记号之后,听听律师的话。没什么意思 这只是他们在尝试思考接下来要说的内容时常使用的术语。但是,我并不是要提倡改变语言,我只是在问为什么是这样。如果有人知道为什么纯粹出于历史,遗迹原因而被人们以这种方式知道,那就是答案。如果我决定浪费时间主张改变语言,那将是弹药。

另一方面,如果实际上有一种有用的原因,为什么某种语言或一段代码必须指向对象,而将所有其他方向都排除在外,而不是仅仅将它们作为工具放在工具带中,那我真的会有兴趣了解它。我喜欢学习有用的东西。


11
我猜“客观地”或“客观地”不会给人真正的印象;-)
Doc Brown

我考虑过“物化”,但决定也可能产生错误的共鸣。
精彩的


1
我认为“对象”是错误,而不是“面向”。我们所谓的面向对象通常是面向类的。
Steve314

1
任何Phoenix Wright粉丝都想称其为“ OBJECTION !!编程”吗?
Katana314

Answers:


24

我相信你正在阅读的方式太多成一个简单的语法结构。看一下您的范例列表,由于我们很快就会知道的原因,它们的排序方式有所不同:

  • 势在必行
  • 功能性
  • 程序
  • 结构化的
  • 陈述式
  • 事件驱动
  • 基于自动机
  • 面向对象

这些词有什么共同点?它们都是形容词,因为它们旨在修改“编程”一词。此外,除了“命令式”外,它们都不是“自然的”形容词,而是“形容词”名词-实际描述范式核心的名词:功能,结构,自动机和宾语。

名词有两种不同的形容方式:通过后缀-al或-ed,或使用连字符创建复合词。现在,正如布朗博士所指出的那样,可以用来形容“对象”的后缀产生了不同的含义。留下成分。

而且我认为,艾伦·凯(Alan Kay)选择使用“面向”作为他的综合形容词“面向对象”纯粹是巧合或趣味。它也可能是“对象驱动的”或“基于对象的”,您可能对它们也读了太多。“驱动”听起来不像是某种不健康的痴迷吗?


1
重点(尽管我认为您是指形容词,而不是副词-在这种情况下,“编程”是一个名词)。
JW01

@ JW01:糟糕,您是对的
Michael Borgwardt

这实际上是一个很好的观点-“面向”一词与“对象编程”赋予不同的含义,因为“对象”一词本身不是形容词。实际上,我想说的是“定向”之所以被冠以别称,是因为这种说法。另外,我没有读任何东西,我在夸大其词是为了指出这个“定向”这个词完全没有文献中的解释和质疑,这让我怀疑它是否实际上在做任何事情来赢得它的地位。 。:P
2013年

想知道为什么他不选择痴迷于对象……哦,是的,那些狂热者不知道何时停止。;-)
Deduplicator

波兰作家JerzyGrębosz写了一本书,名为“ Symfonia C ++”(“ C ++交响曲”),作者在其中尝试以一种有趣的方式来理解这句话:他说它被称为“面向对象”,因为代码可以根据其当前使用的对象“自身”定位(多态行为)。他将其与仅将“对象”作为数据片段的概念的语言区分开来。没有历史证据表明这是原始含义,但即使作为事后解释,也可以解释。
BarbaraKwarc '18

18

但是当谈论对象编程时,我们必须阐明我们是围绕这些对象进行的。我们不能只使用对象吗?我们不能只有物体吗?

坦率地说,这是历史的遗留。函数式编程实际上是面向函数的编程,声明式编程实际上是面向声明的编程...毕竟我们不只是使用函数吗?我们不能只具有功能吗?

“面向对象”可以更好地解决问题,并且在历史上一直根深蒂固。

之所以出现“定向”,是因为我们不是在谈论编程,而是在谈论设计。仅仅因为我们使用对象,使用函数或使用事件并不意味着我们的设计方法是通过对这三个模型进行建模来完成的。通过指定设计方法的方向,它有助于与程序员沟通他们应如何解释和扩展该设计-建模重点如何为实现着色。


因此,这听起来像是您在说“面向对象”是一种带有冗余措辞的策略声明,就像“ pro-active”与“ active”在本质上是一样的,只是附加了一个冗余前缀即可确保听众不会错过意思。
2013年

1
我认为您确实做到了这一点:我们进行面向对象的设计,这就是为什么语言是面向对象的-以便我们表达这种设计。
K.Steff

1
@Excrubulent不,添加“定向”使其更具体。“面向对象”意味着我们不是在讨论有关编程对象的细节,而是在如何设计程序以便它们以有意义的方式使用对象方面。“对象编程”,“功能编程”或“声明编程”将指的是专门谈论那些特定概念的实现,而不是设计原理。“功能性”和“声明性”是带有后缀的单词,试图传达相同的含义,但是对于对象来说,“ objectical”或“ objective”没有多大意义。
Ilari Kajaste

正如迈克尔·伯格沃德Michael Borgwardt)回答的那样,“面向”一词在任何方面都不是特别的。也可以是“驱动”或“基于”的。重要的一点是它不能是“对象编程”。(嗯,拉光厄总是很容易变幻,所以它可以,但是描述性不强。)
Ilari Kajaste

我更改了答案,因为迈克尔·伯格沃德(Michael Borgwardt)的答案实际上解释了该词的含义以及它如何修饰该词组。
2013年

2

调用它有助于解释对象是范例中非常重要的一部分。

面向对象的编程起源于Simula,它本质上是ALGOL加上一些新的对象编程功能。并且与该历史保持一致,即使到了今天,也有可能用许多种语言(甚至是“纯OO语言”)来编写本质上只是一个带有某些对象的过程程序的东西。但是,更有经验的开发人员认为这是不好的风格。

实际上,“面向对象的方式”与“过程的方式”非常不同。最重要的概念是继承和多态性的使用。当您真正理解并内化类和虚拟方法的工作方式时,这是一次令人大开眼界的体验,它在很多情况下都会改变您编写代码的方式,这是真正的范式转变。(当然,假设您首先开始编写过程代码。如今,许多学生直接将Java或C#作为第一语言,而IMO则使他们错过了真正理解OO的好处。)

我们称其为面向对象编程是因为用OO风格编写的程序不仅包含对象,还包含对象。整个程序的结构基于它们以及它们的工作方式。


这与Telastyn的答案类似,不同之处在于您似乎暗示“面向对象编程”这个术语实际上与“对象编程”根本不同。您能解释一下它们可能有什么不同吗?我的意思是,在我看来,OOP是一个宽松的术语,OP也将发挥相同的作用。
2013年

2
如今,许多学生直接将Java或C#作为第一语言,而IMO他们却错过了真正了解OO的好处。-实际上,我是从C ++开始的,在我的第一个作业中,我使用了对象和函数的混合体,但是由于使用函数而被打分。这些功能中的一些纯粹是功能性的,根本没有从封装到对象中受益,但是其他一些为了工作而使用了指向变量的指针(即,修改后的状态信息),则一旦创建它们就变得更容易创建和调用。在一个对象中,所以我已经看到了它的两面。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.