消息/事件与传统方法调用

时间:2011-11-18 18:03:32

标签: c++ objective-c methods messaging

我最近在我的编程语言课程中有一个项目,我在其中研究和学习Objective-C,以便向课堂演示解释语言。我的教授建议我关注Objective-C和C ++之间的一些差异。

我发现的一个差异是Objective-C使用来自Smalltalk的消息传递,它似乎与vb.net中的事件非常相似(vb.net和Java是我最流利的语言)。而C ++使用传统的Pass&返回方法调用。我理解这些之间的差异(我认为)。

我的问题是,消息传递比传统方法调用有什么好处,反之亦然?对于多线程来说,消息传递似乎更好,但我希望在这个主题上有更多受过教育/经验丰富的答案。

3 个答案:

答案 0 :(得分:3)

正如Vlad在评论中提到的,消息传递不直接与函数调用进行比较,因为消息传递是建立在调用之上的系统。您使用消息传递的原因是进一步将您的消费者(调用者)与您的生产者(被调用者)分离。

进行函数调用时,需要对要调用的对象进行某种引用。最小化耦合的一种方法是使用接口,但即使在这种情况下,两个类之间仍然存在直接链接。

通过消息传递,您可以设置您的架构,以便调用者甚至不知道真正的生产者所在的位置。他只需发送消息并等待回复即可。由于消息是一个自包含的对象,因此它们很容易被序列化或简单地从一个代理传递到另一个代理,直到有人最终处理它们并做出响应。

消息传递的另一个优点是工作负载平衡。您可以拥有一个消息队列和一个生成器池(最简单的情况是一个线程池)。当消息到达时,在多核计算机上,您可以同时处理多个消息。

消息传递体系结构在线程和异步编程模型中也非常流行。即使在您始终直接引用生产者的情况下,如果您进行了函数调用,则在您返回之前会被阻止。但是,如果您发送消息,您可以继续工作并最终得到回复。还有其他替代方案,如Windows OVERLAPPED模式和使用回调以及在不同线程上获取响应。在这方面,消息传递是执行异步工作的几种不同模式之一,但它是更好和更广泛接受的模式之一。

答案 1 :(得分:1)

这个网站可以解决你的问题以及更多关于两种编程语言之间差异的问题。我找不到任何特别提到消息传递对传统消息的好处的东西,但是作者对主要概念进行了很好的总结,这可能有助于你解决自己的问题。

以下是我认为你真正喜欢的一个部分的例子,因为它说明了很多关于Objective c vs c ++

的演示文稿的重要内容。

------------------------------------------ 哲学每种语言 -------------------------------------------- ----

将Objective-C对象视为工厂,将C ++对象视为家庭企业。 Objective-C对象往往很大,自包含,并且可以做任何想象的事情。 C ++对象往往很小而且很重要。 C ++对象也倾向于成组,其中Objective-C对象往往更独立。这并不意味着不能有小的Objective-C对象和大型C ++对象,它只意味着趋势是Objective-C对象变大,独立对象和C ++对象变小并相互依赖。

用C ++编程时,每个概念,无论多小,都应该得到自己的类。应用程序通常有数百个(如果不是数千个)类,每个类都很小,并且都是互连的。这可能导致名称冲突,但C ++通过使用NameSpaces解决了其中一些问题。即使没有NameSpaces,C ++也可以通过仅包含所需的头文件来避免名称冲突。如果两个类是私有的,并且从不包含在同一个文件中,则它们可以具有相同的名称。

Objective-C对象应该能够独立存在。没有私有对象,只有一个名称空间,并且在运行时解析对象名称。拥有数千个Objective-C对象会遇到麻烦。

C ++,非虚拟类的零开销,鼓励程序员将int,rects和任何其他数据结构子类化。编写一些代码可以给出范围检查,类型检查,值检查或任何其他可想象的检查。 Objective-C对象有很多开销,并且没有运算符重载。对于rects,int或其他小型数据结构,使用Objective-C类是不切实际的。

尽管许多应用程序都是用C ++编写的,并且C ++在Objective-C上有许多功能,但我发现在Objective-C中编写应用程序比在C ++中编写相同的应用程序更容易,更快。其中一个最大的原因是应用程序中找到的对象数量。在Objective-C中,应用程序中少于100个对象让我可以将程序的整个结构保留在我的脑海中。在C ++中,每个概念都是自己的对象,我一直在寻找哪个对象包含我正在寻找的功能。

Objective-C开发速度更快的另一个原因是它是一种更简单的语言。我见过程序员花费数天时间试图获得恰到好处的深奥C ++函数的语法。 Objective-C没有语言律师茁壮成长的领域。 C ++深奥的语法最糟糕的部分是其他程序员可能无法理解一些更复杂的C ++代码。

更快开发时间的最大原因是自包含对象。 Objective-C对象往往是自包含的,因此如果您需要功能,您只需要包含那个对象,或偶尔包含少量相关对象。另一方面,C ++对象倾向于成组。每次要包含对象的功能时,可能需要包含额外的10-20个对象。

所有这些以及更多here

答案 2 :(得分:0)

值得阅读关于Objective C的维基百科页面,尤其是about messaging部分。

请记住,Objective C是建立在C之上的,因此是C的超集。在Objective C中,您可以使用传统的C编码和函数调用,以及使用消息传递。

在C和C ++等语言中,Objective C消息传递和函数调用之间的一个重要区别是函数调用在编译时被绑定。这导致更快的执行,但动态行为更少。 Objective C使用动态(或延迟)绑定 - 消息的目标在运行时计算出来。这样的系统总是在编译时涉及较少的类型检查,但允许更动态的编码并允许一些有趣的meta programming。消息传递的动态性允许一些有趣的概念,例如Objective C categories,您可以用自己的实现替换任意类的功能。这类似于子类化,但不一样;例如,一个类别不能拥有自己的数据;它作为您正在分类的类的一部分有效运行。

消息传递的功能可以带来更简洁的代码。例如,在Objective C中,您可以向nil发送任何消息,系统将不执行任何操作,只需继续:

NSObject *thing = nil;
[thing someMessage];  // does nothing. No need for nil check!

没有此功能的其他语言(例如C ++,Java)可以使用名为Null Object的设计模式来实现相同类型的效果 - 但这需要实现(实际上,您创建了一个不执行任何操作的存根对象)方法被称为。)

相关问题