代码之家  ›  专栏  ›  技术社区  ›  larsmoa

何时使用信号和插槽,何时不使用

  •  23
  • larsmoa  · 技术社区  · 14 年前

    我们使用的是qt,它提供信号和我发现的插槽 真正地 方便。然而,强大的力量带来了巨大的责任,我认为很容易滥用这个特性。

    信号槽的使用是否有任何最佳实践?我很难用这种方式找到一些通用的指导方针。一些问题(我有明确的意见,但并非所有团队成员都同意):

    • 是否可以使用信号报告错误?
    • 是否可以假定信号将被处理?
    • 信号可以用来启动行动吗?例如。 signal displayInfoScreen() 必须由显示信息屏幕的插槽处理。

    关于何时应该/不应该使用信号的任何其他意见是 非常 欢迎!

    5 回复  |  直到 6 年前
        1
  •  12
  •   e8johan    14 年前

    用信号报告可以吗
    错误?

    是的,例如,参见qftp,其中done信号携带一个状态。它不包含实际错误,只包含发生错误的信息。

    假设一个信号 被处理?

    不。发送者永远不能假定,但是,您的特定应用程序可以依赖于它。例如,要使应用程序工作,需要处理表示文件-new的Qaction,但Qaction对象并不关心。

    可以使用信号启动 行动?例如信号 必须由以下人员处理DisplayInfoScreen()。 显示信息屏幕的插槽。

    同样,是的,例如Qaction对象。但是,如果您希望能够重用组件,则必须小心确保实际的类不依赖于它。

        2
  •  12
  •   Cătălin Pitiș    14 年前

    信号和插槽非常强大,因为它们可以分离对象。你不能假设一个信号已经连接了一个插槽,就像前面回答的那样。

    基于信号/时隙的设计的一个主要缺点是,您可以很容易地对实现的逻辑进行松散跟踪。 ,因为一个对象的一个操作可以触发连接到所发出信号的任何其他对象的其他操作。更容易产生不需要的副作用、递归调用等。

        3
  •  10
  •   erelender    14 年前

    是否可以假定信号将被处理?

    不,不是。信号是火和忘记类型的事情。谁连接到信号,它做什么不应该是发射器的问题。

        4
  •  5
  •   Caleb Huitt - cjhuitt    14 年前

    是否可以使用信号报告错误?

    是的,但我通常会使这种情况依赖。如果错误可能是异步发生的,那么表示错误的信号绝对是正确的。如果错误只在客户端代码调用某个特定函数时发生,那么错误应该出现在该函数的响应中,而不是作为信号。但是,在这两种情况之间有很多情况可以根据具体情况来处理。

    此外,信号槽机制可以使跨线程通信更容易(这很可能被视为异步情况),为此我将使用它们(错误或否)。

    是否可以假定信号将被处理?

    信号(从哲学上)被设计用来表明发生了什么事情。正如其他人所指出的,假设一个信号将与一个插槽匹配,甚至与 其他插槽。

    信号可以用来启动行动吗?例如,信号显示信息屏幕()必须由显示信息屏幕的插槽处理。

    信号可以用来启动行动,但可能不会影响你的思维方式。信号表明 已经发生了。如果监视类的代码决定 发生这种情况时,应显示一个对话框,然后使用该信号启动该操作。但是,发出信号的类通常不负责确保发生正确的操作,因为它不负责执行该操作。(如果是,那么它应该是同一类的一部分,不需要任何信号。)

        5
  •  3
  •   Vincent Robert    14 年前

    信号/插槽(也称为事件)是消除对象之间耦合的好方法。

    例如,视图不能理解模型是如何工作的,当模型改变时,它们“倾听”模型。模型负责说出它何时改变,什么改变。

    事件的问题在于,当您使用客户机需求设计事件时。例如,您不应该有信号 displayInfoScreen 因为它假设了使用这个信号的对象。相反,应该是 infoChanged 以及 InfoScreenDisplayer 监听此信号以将其显示在屏幕上。如果需要,可以稍后添加 InfoTweeterPoster 在tweeter上发布信息。