我们正在使用提供信号和插槽的Qt,我发现非常方便。然而,强大的力量带来了巨大的责任,我认为很容易滥用这个功能。
是否有信号槽使用的最佳做法?我很难以这种方式找到一些通用指南。一些问题(我有明确的意见,但并非所有团队成员都同意):
signal displayInfoScreen()
必须由显示信息屏幕的插槽处理。关于何时应该/不应该使用信号的任何其他意见非常欢迎!
答案 0 :(得分:12)
信号和插槽功能强大,因为它会分离对象。您不能假设信号已连接插槽,如前所述。
基于信号/插槽的设计的一个主要缺点是,您可以非常轻松地跟踪您实现的逻辑,因为对象的一个动作可以触发连接到的任何其他对象的其他动作发出的信号。更容易产生不必要的副作用,递归调用等。
答案 1 :(得分:12)
使用信号报告是否可以 错误?
是的,例如,请参阅QFtp,其中完成信号带有状态。它不包含实际错误,只包含发生错误的信息。
可以假设信号会 处理?
没有。发件人永远不会假设您的特定应用程序可以依赖它。例如,需要处理代表File-New的QAction以使应用程序正常工作,但QAction对象可能并不在乎。
可以使用信号启动 行动?例如。信号 displayInfoScreen()必须由。处理 一个显示信息屏幕的插槽。
再次,是的,例如QAction对象。但是如果你想重用组件,你必须小心确保实际的类不依赖它。
答案 2 :(得分:10)
可以假设信号会被处理吗?
不,不是。信号是一种即发即弃的东西。谁连接到信号及其作用不应该是发射器的关注点。
答案 3 :(得分:5)
使用信号报告错误是否可以?
是的,但我通常会依赖这种情况。如果错误可能异步发生,那么表明这种情况的信号肯定是正确的。如果错误仅在客户端代码调用某个特定函数时发生,则错误应该在该函数的响应中,而不是作为信号。但是,两者之间可能存在各种各样的情况。
此外,信号槽机制可以使跨线程通信更容易(这可能被认为是异步情况),我会将它们用于此目的(错误或否)。
可以假设信号会被处理吗?
信号(哲学上)旨在表明发生了某些事情。正如其他人所指出的那样,假设一个信号与一个插槽匹配,或者甚至只用一个其他插槽,这绝不是一个好主意。
可以使用信号来启动操作吗?例如。信号displayInfoScreen()必须由显示信息屏幕的插槽处理。
信号可用于启动操作,但可能不符合您的想法。信号表明发生了 foo 。如果监控您的类的代码决定何时发生 foo ,则应显示一个对话框,然后使用该信号启动该操作。但是,发出信号的类通常不负责确保发生正确的动作,因为它不负责执行该动作。 (如果是,那么它应该是同一类的一部分,并且不需要信号。)
答案 4 :(得分:3)
信号/插槽(也称为事件)是删除对象之间耦合的好方法。
例如,不是拥有了解模型如何工作的视图,而是在模型发生变化时,他们“倾听”模型。该模型负责说明它何时发生变化,发生了什么变化。
事件的问题在于您根据客户要求设计事件。例如,您不应该有一个信号displayInfoScreen
,因为它假定使用此信号的对象。相反,它应该是infoChanged
并且InfoScreenDisplayer
会侦听此信号以在屏幕上显示它。如果需要,您可以稍后添加InfoTweeterPoster
,以便在Tweeter更改时发布信息。