我最近问了一个关于我所谓的“方法调用”的问题。答案提到了“消息”。作为一个自学成才的业余程序员,试图提出一些不会让我看起来像个白痴的问题,我意识到我使用的术语揭示了很多关于我是如何学习编程的。
方法/消息/等的各种术语之间是否有区别?在OO编程中?这是来自使用不同术语来描述相似概念的不同编程语言的差异吗?
我似乎记得在 OO 之前的语言中,有时会根据是否期望返回值来区分“子例程”和“函数”,但即便如此,这是逐语言的区别吗?
我最近问了一个关于我所谓的“方法调用”的问题。答案提到了“消息”。作为一个自学成才的业余程序员,试图提出一些不会让我看起来像个白痴的问题,我意识到我使用的术语揭示了很多关于我是如何学习编程的。
方法/消息/等的各种术语之间是否有区别?在OO编程中?这是来自使用不同术语来描述相似概念的不同编程语言的差异吗?
我似乎记得在 OO 之前的语言中,有时会根据是否期望返回值来区分“子例程”和“函数”,但即便如此,这是逐语言的区别吗?
我发现这是一种语言和编程范式。一种范式 — OOP — 指的是具有成员方法的对象,从概念上讲,这些方法是您向这些对象发送消息的方式(例如,这种视图反映在 UML 中)。
另一种范式——函数式——可能涉及也可能不涉及对象类,但函数是工作的原子单元。
在结构化编程中,您有子例程(注意前缀“sub”暗示结构)。
在命令式编程中(与结构化编程有很多重叠,但看待事物的方式略有不同),您对世界有更公式化的看法,因此“函数”代表一些操作(通常是数学)。
你所要做的就是使用语言参考所使用的术语来表达你所使用的语言。
消息!=方法!=功能
在 OOP 中,不同的对象可能有不同的方法绑定到同一个消息。
例如:消息“向左旋转 n 度”将由不同的对象实现,例如形状、圆形、矩形和正方形。
消息:对象通过消息进行通信。
- 对象发送和接收消息。
- 对消息的响应正在执行一个方法。
- 使用的方法是在运行时确定接收者。
在 C++ 中,方法和消息被称为函数成员。
在 C# 等面向对象的实现中,“消息”的概念并不真正作为显式语言结构存在。你不能看着一段特定的代码然后说“这就是信息”。
相反,一个对象类的方法意味着其他对象可以发送一种类型的消息来触发该方法中的行为。所以你最终只是直接指定方法,而不是发送消息。
使用 Smalltalk 等其他实现,您可以看到正在传递的消息,并且接收对象可以处理该消息。
有一些库位于诸如 C# 之类的语言之上,它们试图恢复该语言的显式消息传递感觉。为了好玩,我一直在自己做一个:http: //collaborateframework.codeplex.com/
我相信消息在smalltalk中使用。
Java、C#等倾向于使用方法或实例方法。
我很确定(但快速的Wikipedia检查似乎证实了这一点)“消息传递”术语来自 Smalltalk 社区。我认为它或多或少等同于方法调用。
“消息”一词可以指向对象发送消息,某些编程语言支持此消息,而其他语言则不支持。
如果对象支持该消息,那么它将执行一些代码。否则它只会忽略它。这是一种比对象必须支持该函数的显式函数/方法调用更动态的方法。
我相信,Objective-c 使用了这种消息传递方法。
我不确定消息术语的来源。大多数情况下,我在 UML 设计中遇到消息。对象(UML 术语中的 Actor)可以通过消息相互通信。在现实世界中,代码消息通常只是一个函数调用。我认为消息是与某个对象进行通信的尝试。它可以是真实的消息(如操作系统中的消息)或函数调用。
通常,“方法”似乎是函数的正确名称。但是,每种语言都有自己的关键字。例如,Delphi 甚至在返回某些东西的方法(“函数”)和返回什么都没有的方法(“过程”)之间有所不同,而在 C 类型语言中,没有区别。
以下是一些简化的定义:
方法/子程序/voids: 执行一个动作
功能: 执行一个动作并返回一个值
events: 当一个对象被操作时被调用
handlers: 是处理事件的函数/方法
PS:这是一个完美的例子,说明为什么 SO 应该支持 DL/DT/DD 标签。
我认为,在这一点上,这是一个偏好问题。你提到的词在今天的语言中基本上是同义词,如果你说“方法”或“函数”,大多数人都会理解你的意思。如果您使用仅在 OOP 中真正使用的“消息”,那么您可能会混淆您试图传达的内容。例如:“我需要创建一条消息来发送电子邮件消息”。其他可能是同义词的术语,这不是一个完整的列表,是子程序、动作、过程、操作(尽管通常是数学性质的)、子程序、命令......
方法:类似于传统语言中的函数
message:类似于传统语言中的参数传递