Boost::Signals的作用是什么?

4

首先,我是一个编程的绝对初学者,所以不要太嘲笑我。
我所见过信号用于GUI工具包,而GUI工具包都带有自己的信号。那么,Boost:Signals能否与这些GUI工具包一起使用呢?这是个好主意吗?信号还有哪些其他应用?

4个回答

6

Signals是一种事件消息实现,类似于Smalltalk/Objective C中的Messages或其他各种语言(例如C#)中的Events

您可以将它们用于各种任务,请查看Observer Pattern

为什么要使用观察者模式?

好处主要在于组织上,在处理大型应用程序时,应用可重用的模式有助于维护开发团队的协调性。

当特定模式的实现成为事实标准(或接近),它尤其有用,因为这意味着新团队成员的引导时间可能会加快,不仅是因为他们以前使用过该实现,而且因为该实现的流行意味着有广泛的资源和文档可用于加速学习。

从纯代码角度来看,所有模式都显得臃肿,但是当您开始理解软件开发涉及的成本中高达60%是在维护生命周期中时,额外的代码值得获得协调性。

另一个好处是帮助软件重用,根据实现的方式,观察者模式可以协助将类模块化和解耦。我建议这也是一种组织上的好处,因为不同的团队可以更容易地构建组件,或者仅仅因为组件更容易被替换。

观察者模式似乎只是多余的代码来调用方法。看起来我可以直接调用我想要的对象的方法,而不是创建一个信号,让对象捕捉它,然后启动其方法之一。也许我漏掉了什么? - Patrick
2
@Patrick,对于观察者模式,你想知道为什么要调用notify(),传递一些消息,然后让notify()调用foo(),而不是直接调用foo()。如果您知道正在处理哪个类,则可能可以直接调用foo(),但思想是解耦模块。您的模块不需要知道Foo模块的详细信息--它只需要通知一个监听器(而Foo恰好是一个监听器)。通过打破这种依赖关系,单元测试和维护变得更容易。将来还可以更轻松地通知Bar对象(或任何其他侦听器)。 - Tim
1
谢谢你们两位。我刚开始学习,了解到所有的东西都应该分开来,这很有道理。非常感谢你们如此深入的解释。 - Patrick

4

仅供参考,信号不仅用于GUI工具包中。它们用于想要将数据的生成者与接收者解耦的情况(例如上面提到的观察者模式)。如果将该思想与线程混合使用,则可以轻松实现演员,这是一种有趣的并发任务模式(例如Erlang和Scala使用演员)。


1
在这种情况下,回调函数将代表数据生产者线程/actor执行吗?如果我希望数据由接收方代表其自己的线程进行处理,该怎么办?我需要使用某种类型的线程安全队列吗? - dimba

2

一个可能的用途是在实现GUI工具包时使用。你基本上需要设置连线,以便从原生系统获取消息(或称之为任何内容)以产生信号。从那里开始,路由和处理信号的代码可以(至少有些)可移植。


2
除了其他人提到的观察者模式之外,每当你发现自己需要编写回调函数以便一个类可以通知另一个类发生了什么事情时,你就可以使用信号和槽。与回调相比,它的优点在于它处理了添加和移除回调函数的大量样板代码,并在调用方或被调用方超出范围时自动断开连接。
然而,回调实际上只是观察者模式的一种实例。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接