【问题标题】:'method' vs. 'message' vs. 'function' vs. '???'“方法”与“消息”与“功能”与“???”
【发布时间】:2010-09-07 19:27:51
【问题描述】:

我最近问了一个关于我所谓的“方法调用”的问题。答案提到了“消息”。作为一个自学成才的业余程序员,我试图提出一些不会让我看起来像个白痴的问题,我意识到我使用的术语揭示了我是如何学习编程的。

方法/消息/等的各种术语之间是否有区别?在OO编程中?这是来自不同编程语言使用不同术语来描述相似概念的差异吗?

我似乎记得在 OO 之前的语言中,有时会根据是否期望返回值来区分“子例程”和“函数”,但即便如此,这是否是逐个语言的区别?

【问题讨论】:

    标签: language-agnostic terminology


    【解决方案1】:

    我发现这是一种语言和编程范式。一种范式 — OOP — 指的是具有成员方法的对象,从概念上讲,这些方法是您向这些对象发送消息的方式(例如,这种视图反映在 UML 中)。

    另一种范式——函数式——可能涉及也可能不涉及对象类,但函数是工作的原子单元。

    在结构化编程中,您有子例程(注意前缀“sub”暗示结构)。

    在命令式编程中(与结构化编程有很多重叠,但看待事物的方式略有不同),您对世界的看法更加公式化,因此“函数”代表某种操作(通常是数学)。

    您所要做的就是使用语言参考所使用的​​术语来表示您正在使用的语言。

    【讨论】:

    • 如果函数是原子的,这是否使声明成为中子?一个夸克的标识符?希格斯玻色子在哪里?
    • 希格斯玻色子是个例外。存在中不可避免的一部分,但是当你在寻找它们时很难找到。
    • 只是为了避免混淆:并发编程中的原子操作是一次完全运行的程序操作,没有受到其他进程干扰的风险。例如,java 中的 int 赋值是原子的,而 long 赋值不能保证是原子的。从这个意义上说,函数通常不是原子的。
    【解决方案2】:

    Message!=Method!=function

    在OOP中,不同的对象可能有不同的方法绑定到同一个消息

    例如:消息“向左旋转 n 度”将由不同的对象实现,例如形状、圆形、矩形和正方形。

    消息:对象通过消息进行通信。

    -对象发送和接收消息。

    -对消息的响应正在执行一个方法。

    -使用的方法是在运行时确定接收者。

    在 C++ 中,方法和消息被称为 函数成员。

    【讨论】:

    • C++ 并不真正使用消息传递。对象具有有时称为方法的成员函数,您可以直接调用它们而不是传递消息符号。
    • 这不是关于消息传递或拥有成员函数,而是关于逻辑流。您不对消息中的数据进行任何排列,您只将信息从一个对象发送到另一个对象,因此是“消息”。当您想弄乱数据/对象时,您应该使用方法。函数是一个基本的编程术语,消息/方法都是函数,甚至构造函数也是函数。通常为了保持逻辑流程清晰易懂,当需要处理数据/需要更新对象时发送消息。消息的最终接收者执行方法来完成操作。
    • 我应该补充一点,显然方法是对象的成员函数,并且消息通常也是成员函数,但其​​唯一目的是作为线人或传递数据。在该对象中更改或创建新数据时应使用方法(或成员函数)。封装是我们使用消息的原因,这也是为什么我们不称它们为方法的原因,因为它们不是该对象/类的方法,它们只是通知应该使用此信息的类/对象。
    【解决方案3】:

    在 C# 等面向对象的实现中,“消息”的概念并不真正作为显式语言结构存在。你不能只看一段特定的代码就说“这就是信息”。

    相反,对象类的方法意味着其他对象可以发送某种类型的消息来触发该方法中的行为。所以你最终只是直接指定方法,而不是发送消息。

    使用 Smalltalk 等其他实现,您可以看到正在传递的消息,并且接收对象能够处理该消息。

    有些库位于诸如 C# 之类的语言之上,它们试图恢复该语言的显式消息传递感觉。为了好玩,我一直在自己做一个:http://collaborateframework.codeplex.com/

    【讨论】:

      【解决方案4】:

      我相信 message 用在 smalltalk 中。

      Java、C#等倾向于使用方法实例方法

      【讨论】:

        【解决方案5】:

        我很确定(但快速检查Wikipedia 似乎证实了这一点)“消息传递”术语来自 Smalltalk 社区。我认为它或多或少相当于一个方法调用。

        【讨论】:

          【解决方案6】:

          “消息”一词可以指向对象发送消息,这在某些编程语言中受支持,而在其他语言中不支持。

          如果对象支持消息,那么它将执行一些代码。否则它只会忽略它。这是一种比对象必须支持该函数的显式函数/方法调用更动态的方法。

          我相信,Objective-c 使用了这种消息传递方法。

          【讨论】:

            【解决方案7】:

            我不确定 message 术语的来源。我经常在 UML 设计中遇到 messages。对象(UML 术语中的参与者)可以通过 消息 相互通信。在实际代码中,message 通常只是一个函数调用。我认为消息是与某个对象进行通信的尝试。它可以是真实的消息(如操作系统中的消息)或函数调用。

            【讨论】:

            • 起源是Smalltalk的旧设计。 Alan Kay 简单地玩弄了并发的 Actor 模型,并让每个对象都成为自己的 Actor,在自己的线程中运行。在那个系统中,方法调用真正异步消息发送。这种设计很快就被恢复了,术语没有。
            【解决方案8】:

            通常,“方法”似乎是函数的正确名称。但是,每种语言都有自己的关键字。例如,Delphi 甚至在返回某些内容的方法(“函数”)和返回无内容的方法(“过程”)之间做出了区分,而在 C-Type 语言中则没有区别。

            【讨论】:

              【解决方案9】:

              这里有一些简化的定义:

              方法/子例程/voids: 执行一个动作

              功能: 执行一个动作并返回一个值

              事件: 当一个对象被操作时被调用

              处理程序: 是处理事件的函数/方法


              PS:这是一个完美的例子,说明了为什么 SO 应该支持 DL/DT/DD 标签。

              【讨论】:

                【解决方案10】:

                我认为目前这是一个偏好问题。你提到的词在今天的语言中基本上是同义词,如果你说“方法”或“函数”,大多数人都会理解你的意思。如果您使用仅在 OOP 中真正使用的“消息”,那么您可能会混淆您试图传达的内容。例如:“我需要创建一条消息来发送电子邮件消息”。其他可能是同义词的术语,这不是一个完整的列表,包括子程序、动作、过程、操作(尽管通常是数学性质的)、子程序、命令......

                【讨论】:

                  【解决方案11】:

                  方法:类似于传统语言中的函数

                  message:类似于传统语言中的参数传递

                  【讨论】:

                    猜你喜欢
                    • 2021-07-10
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-10-04
                    • 2019-01-30
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多