C++ Boost::Signals的意义是什么?

C++ Boost::Signals的意义是什么?,c++,boost,signals,boost-signals,boost-signals2,C++,Boost,Signals,Boost Signals,Boost Signals2,首先,我是编程的绝对初学者,所以不要太取笑我。 我所看到的唯一一件用于信号的东西是GUI工具包,GUI工具包都有自己的信号。那么,Boost:Signals甚至可以与这些GUI工具包一起使用吗?这是个好主意吗?信号还有哪些其他应用 信号是一种事件消息传递实现,与Smalltalk/Objective C消息或各种其他(例如C#)语言中的事件非常相似 您可以将它们用于各种各样的任务,请查看 为什么要使用观察者模式? 好处主要是组织性的,当您使用大型应用程序时,应用有助于保持开发团队一致性的重用模式

首先,我是编程的绝对初学者,所以不要太取笑我。

我所看到的唯一一件用于信号的东西是GUI工具包,GUI工具包都有自己的信号。那么,Boost:Signals甚至可以与这些GUI工具包一起使用吗?这是个好主意吗?信号还有哪些其他应用

信号是一种事件消息传递实现,与Smalltalk/Objective C消息或各种其他(例如C#)语言中的事件非常相似

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

为什么要使用观察者模式? 好处主要是组织性的,当您使用大型应用程序时,应用有助于保持开发团队一致性的重用模式非常重要

当一个特定模式的实现成为事实(或接近事实)时,它特别有用,因为这意味着新团队成员的提前期可能会加快,不仅如果他们以前使用过该实现,而且因为该实现的普及意味着有广泛的资源,以及可用于加速学习的文档

从纯代码的角度来看,所有模式都显得臃肿,但当您开始了解到软件开发中60%以上的成本都在维护生命周期中时,额外的代码获得一致性是非常值得的


另一个好处是有助于软件重用,根据实现的风格,观察者模式可以帮助模块化类并将类彼此分离。我建议这也是一个组织上的好处,因为不同的团队可以更容易地构建组件,或者仅仅因为组件更容易替换。

一个可能的用途是实现GUI工具包。基本上,您需要设置从本机系统获取消息(或调用任何消息)以生成信号的连线。从那里,路由和处理信号的代码可以(至少在某种程度上)移植。

只要我的两分钱,信号不仅仅用于(或用于)GUI工具包。它们用于需要将数据的生产者与数据的接收者解耦的环境中(例如,上面提到的观察者模式)。如果将这一思想与线程相结合,就可以轻松地实现actors,这是一种用于并发任务的有趣模式(例如,Erlang和Scala使用actors)。

除了其他人提到的观察者模式之外,只要您发现自己必须编写回调函数,因此,一个类可以通知另一个类发生了什么,然后您可以使用信号和插槽。与回调相比,它的最大优势在于,它需要处理大量的锅炉板代码来添加和删除回调函数,并处理在调用方或被调用方超出范围时自动断开连接的问题


回调实际上只是观察者模式的一个实例。

观察者模式似乎只是调用方法的额外代码。似乎我可以调用我想要的对象的方法,而不是创建一个信号,让对象捕捉它,然后启动它的一个方法。也许我遗漏了什么?@Patrick,对于观察者模式,您想知道为什么要调用notify(),传递一些消息,从而让notify()调用foo()——而不是直接调用foo()。如果您知道要处理的是哪个类,您可能可以直接调用foo(),但其思想是将模块解耦。您的模块不需要知道Foo模块的详细信息——它只需要通知()一个侦听器(而Foo恰好是一个侦听器)。通过打破这种依赖关系,单元测试和维护变得更加容易。以后通知Bar对象(或任何其他侦听器)也更容易。谢谢你们。我刚刚开始认识到,一切都应该分开,这很有道理。感谢您的深入解释。在这种情况下,回调将代表数据生产者线程/参与者执行吗?如果我希望接收方代表它自己的线程处理数据,该怎么办?我需要某种线程安全队列吗?