我喜欢用UML记录我的信号槽连接(例如,特殊情况下的连接)。我使用的是Enterprise Architect,当每个类有5个以上的Signals和/或Slot时,它会变得非常混乱。我尝试了流程图和组件图:
流程图:我将类建模为进程,并将端口用于我的信号/插槽。
组件图:我的类使用组件,信号槽使用Interface。
你有建模信号/插槽的经验吗?你有什么建议?是否有更适合信号/插槽的解决方案?
Charly
我一直使用序列图,因为我发现显示对象之间流量传输的"生命线"系统与信号/插槽模式自然匹配。引用维基百科文章链接到上面:
序列图以平行的垂直线(生命线)显示同时存在的不同进程或对象,以水平箭头显示它们之间交换的消息,按它们发生的顺序排列。这允许以图形方式指定简单的运行时场景
似乎同意这个观点,而且读起来很容易。
至于插槽的调用顺序,Qt文档对此进行了澄清:
如果多个插槽连接到一个信号,则在发出信号时,这些插槽将按照连接的顺序依次执行
时间是一个相对的术语,可以用来指定你想要的任何东西:只要你对你正在交流的内容保持一致和清晰,没有人会介意。
在一个简单的类图中,您可以记录类(或接口)和信号之间的关系:
- 信号用带有关键字
«signal»
的分类器符号来表示。它可以具有用与消息的内容相对应的属性表示的参数 - 信号通常通过操作发送。这用相关操作对信号的
«send»
依赖性来表示 - 类可以指示它可以处理具有接收的给定信号,例如,类似于操作,但前面有
«signal»
,并与信号完全一样命名,其属性出现在其参数列表中。受体可以在单独的隔室中进行视觉分离。这对应于Qt插槽
在活动图中(从UML的角度来看,它比"流程图"要好,因为流程图不是UML,也不是标准化的),你可以指定信号的动态:
- 发送对象节点,其对应于在活动流中发出的信号
- 接受事件节点,其对应于可能接收到的信号以及当其发生时的后续动作
- 您可以使用依赖项将两者链接起来,但不必(尤其是在许多对象之间有许多发送/接受的信号的情况下)
最后,这种建模的优点是,可以将信号用作状态图中的事件,并以非常简单、独立于实现的抽象方式表达相当复杂的事情。