【问题标题】:How can the c# .net event construct best be represented in a UML class diagram?如何在 UML 类图中最好地表示 c# .net 事件构造?
【发布时间】:2012-07-02 18:49:08
【问题描述】:

我正在设计一个实体/组件系统,其中通过事件消息系统解决实体内通信的问题。组件分为两部分,一个在实体中,一个在子系统中的“实体代理”,通过观察者类型系统保持同步。我正在尝试使用事件和委托来实现。

我正在尝试为我的应用程序的事件/消息传递系统的结构建模,但我遇到了代表问题。现在的方式是一个图表(附加),显示了系统中的委托、eventArgs 和实体,但是它们的关系的性质仅表示为通用关联。我还有第二张图显示了系统的接口。我需要展示这些对象中引发的事件,因为这是系统中最复杂的地方。

我知道我也需要动态协作和时序图,但我试图弄清楚我需要什么样的事件支持类和多少个不同的事件支持类,以及继承结构是什么样的。我想给自己一个我知道可以协同工作的消息类型的选择。我想我可以从这些预定义类型中选择一个 EventArgs 派生和一个委托类型,以便在动态图表和组件构建时重用。

我想不通的主要事情是将事件建模为属性还是操作。我一直在尝试为委托使用关联类,并使用带有事件构造型的 OnSomeEvent() 类型操作。我不喜欢这样,因为事件不是操作。我已经在代码中使用此 On****() 命名约定保护了方法。这种方法并没有真正捕获委托签名、多播行为和观察者模式。

其他人使用什么方法来表达这些复杂且紧密耦合的类?对我来说,图表的重点是记录和更全面地理解系统中的接口。在我的流程的这个阶段,我希望冻结接口并继续实现组件本身。

【问题讨论】:

    标签: c# events delegates uml


    【解决方案1】:

    我不会在静态类图中包含信号字符,因为信号(这是事件的用途)是一种动态行为。我会照原样接受事件代表(即带有他们的签名),并将它们作为类的普通操作包含在内。我认为这与对象能够非常恰当地发送事件并指定事件类型的想法相吻合。

    应在动态图中对哪些信号去往何处以及订阅谁进行建模。

    编辑:

    您是否考虑过为类的属性分类添加诸如 > 或 > 之类的刻板印象?

    【讨论】:

    • 我昨天发现了通用事件处理程序 (EventHandler),所以我想我会删除自定义委托并尝试您的建议。还有另一个图表显示了有关实现此处所示接口的类的更多详细信息。此图是出于定义我在第一次尝试对 Start New Game/Map Initialization 用例建模时引用的类型的需要而产生的。似乎每次互动都会增加两个新课程!我明白为什么团队在游戏项目中如此普遍。
    【解决方案2】:

    从静态角度查看模型时,事件和委托被视为简单方法。一些工具通过提供构造型或标记来扩展规范,以将您的方法显示为事件/委托并将它们与普通方法区分开来。

    另一方面,您的事件和委托参数应建模为类。当时间因素被添加到您的模型时,事件才有意义,在这种情况下,您可以使用 UML event and trigger 元素(支持synchronous and asynchronous 消息传递)。

    附带说明,UML 是一种半正式语言,它使得例如两个不相关的状态机之间的事件排序之类的事情无法得到保证,尽管这可以通过使用诸如 MARTE 之类的 UML 配置文件来定义(它已经很久了时间我没有看它所以事情可能已经改变了)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      相关资源
      最近更新 更多