【问题标题】:UML: how to model a protocol that involve Logic+Data structures+ModulesUML:如何对涉及逻辑+数据结构+模块的协议进行建模
【发布时间】:2014-12-03 23:11:47
【问题描述】:

我通常从事协议建模的任务,这通常涉及 3 个主要方面:

  • 逻辑:(if (cond) action 1;else action 2)
  • 模块或设备:模块 1 将此消息发送到模块 2,或客户端请求服务器。
  • 数据结构:客户端将此数据(param1、param2..)发送到服务器。

我不确定如何在 UML 中以一种可以理解的关系来表示这 3 个元素。

我的主要问题是“如何在 UML 中以一种使它们之间的关系直观的方式表示这 3 个元素?”

  • 使用什么主图类型?活动?
  • 如何表示模块/设备?泳道?
  • 如何表示消息和消息结构?对象+类图?
  • 还有其他建议吗?

示例

为了让问题更准确,下面是一个简单的协议:

 This is a protocol of synchronization between an user interface and a
 server with the program logic.

 =Start-up process=

 The user set the communication to synchronous (the
 user interface have to pull for changes every few seconds, only
 possible for low usage and simple programs) or asynchronous (the server
 send changes directly to the user interface)

 The user also set a general purpose URL (G), that point to the server.

 Async
     If the communication is async, the UI request to the server for 2 URL:
     * R : reception socket, to get informed about changes and update the UI
     * S : sending socket, to request for get/set/change/create data in 
           the server. 

     The UI open the R socket with the server.

 =Live process= 

 Sync: 
     If the communication is sync, the client ask to G any get/set/change/
     create operation.

 Async: 
     If the communication is async, the client request through S an operation. 
     The request contain:
     * the R ip+port
     * The UI element identifier to be updated (only for get operations)
     * Data requiere for the operation: the request and requiered data.

     The server save for every request following data:
     * The user that make the request (for example the R IP+port)
     * Unique reference to the UI element that will contain the data
     * Unique references to the data to be returned to the client (for example
       database.table.rowId.column) The user+ UI element is unique, so a new
       data reference will override the old data reference. That is a way from
       the server to save what each client is showing.

     After any change is made on a data, the new value is sent to every user
     that are showing this value through R.

 =Shutdown process=
 When the client close R, the server may drop/free every saved references 
 for this user.

 -

接下来是我尝试用活动图对其进行建模:

【问题讨论】:

  • 模块或设备也可以表示为对象。我同意将消息/事件作为类的一部分的想法,在 UML 中不是很有表现力
  • 在这个例子中,客户端是一个设备,服务器是另一个,所有这些逻辑都应该是它们的一部分。如果我将它们表示为对象,如何做到这一点?
  • 您可以从这里获得示例图(我将其放在评论中,因为将来链接可能不可用):escain.org/UI_protocol.vpp
  • “URL”是什么意思?
  • 在这种情况下,该协议适用于与服务器通信的 Web 用户界面。 URL是服务器的URL,例如:www.example.com/myapp.php

标签: uml


【解决方案1】:

简短的快速回答

在 U.M.L.一切都被认为是一个类的实例(A.K.A.“对象”)。

[1] 使用什么主图类型?活动?

用例图 类图 活动图 (其他取决于)

[2] 如何表示模块/设备?泳道?

结构:类图 逻辑:活动图+泳道

[3] 如何表示消息和消息结构?对象+类图?

很好。这在 UML 中应用得不是很好。

我有这方面的工作。

正如您提到的,Message 也可以表示为 Object, 其中参数是属性。

单个消息的发送可以表示为由类响应或执行的方法,带有参数。

[4] 还有其他建议吗?

阅读其余答案。

冗长乏味的扩展答案

U.M.L.以面向对象范式为中心。 所以,像通信这样的场景,可能看起来有点不合适, 然而,仍然可以用 UML 来描述。

除了少数例外,使用事件/消息/信号通常与许多 O.O.P 无关。编程语言。

与许多程序一样,您可以从用例图开始, 表示与系统交互的Actor

然后,您可能想用类图来描述系统的类/对象。

您的“设备”也可以描述为类。

有一个User 设备:

The user

这可以建模为一个类的实例:

......................
..+----------------+..
..|     Client     |..
..+----------------+..
......................

然后:

The user set the communication to synchronous

User 类有一个属性(“CommunicationMode”),可以是:“未定义”、“同步”或“异步”。 “未定义”表示设备已关闭。

.........................
..+-------------------+..
..|      <<enum>>     |..
..| CommunicationMode |..
..+-------------------+..
..|[+] Undefined      |..
..|[+] Synchronus     |..
..|[+] Asynchronus    |..
..+-------------------+..
.........................

..................................
..+----------------------------+..
..|          <<class>>         |..
..|           Client           |..
..+----------------------------+..
..|[+] CommunicationMode: Mode |..
..+----------------------------+..
..................................

程序的逻辑可以用多种图表来描述,如活动图状态图序列图。 p>

状态图序列图活动图的特例。所以,如果你不是很精通它们,你可能会坚持活动图(s)。

[建设中]

【讨论】:

  • 感谢您非常广泛的解释 :-) 类图是一个很好的优点,我也应该为每种消息类型制作它们。你没有说我的活动图,我应该理解你“认可”它吗?另外,您建议我使用“用例”图,但它在这种情况下有用吗?
  • 对于行为方面,不要错过几乎一体化的uml-diagrams.org: UML Interaction Overview Diagrams
  • @Adrian Maire 您的活动图是一个好的开始,但是,您可能需要为端口(“S”、“G”等)添加额外的泳线,即使它们是客户端的一部分。
  • @Adrian Maire 在这种情况下,“用例”并不那么相关,但是有助于将所有内容放在一个更一般的概念中,将细节留给其他图表。通常,一个单一的“用例”,可能会被拆分成几个更小的“用例”
【解决方案2】:

我的第一个想法是活动图,看起来你的在建模你描述的行为方面做得很好。我有一些观察结果可能会激发改进:

  1. 我不确定我是否会在服务器活动上使用起点,因为服务器没有任何不是由用户首先发起的活动。
  2. 我看到单个活动路径的多个端点。应该有决策逻辑来决定应用哪个端点。例如,“通过 G 的简单请求”和“简单服务器操作”表示同一活动序列的两个冲突端点。
  3. 这些多个端点意味着您可以在不执行关机过程的情况下退出系统,这似乎不太可能。

我还会给你一些概括,你可能会觉得有帮助。

UML 图分为两类:行为图和结构图。行为图包括用例、活动、序列和状态图等。结构图包括类图、对象图、组件图和部署图。

正如 umlcat 所提到的,活动图和状态图非常相似。区别实际上是焦点问题。活动图关注行为,状态图关注行为的影响——不同的活动如何导致状态变化。

现在,序列图和活动图之间的主要区别(除了它们看起来不同)是范围。活动图可以很好地建模并行行为和复杂的决策树,而序列图可以很好地详细建模特定序列的相关活动的行为(它们不能很好地建模并行行为和复杂的决策)树)。例如,您可以将通过活动图的每条路径(“路径”是从 UI 起点到其中一个端点的线)建模为单独的序列图,深入了解每个活动节点的实际情况可以。

如果您希望准确地建模出您将如何实现活动图所描述的行为,那么是时候使用类图了。

用例图不如活动图详细。您的用例图可能包含三个用例:初始设置、操作和关闭,以及两个参与者,用户和服务器。它可能还会将生成 URL 作为初始设置的扩展,并且可能还会扩展两个服务器活动的操作。这将提供您在活动图中描述的行为的高级概述。如果这有助于向您的员工解释问题域,请务必创建一个。

【讨论】:

    猜你喜欢
    • 2014-06-27
    • 2011-05-08
    • 1970-01-01
    • 2017-11-28
    • 2013-09-28
    • 2019-10-04
    • 1970-01-01
    • 2018-05-15
    • 2017-09-01
    相关资源
    最近更新 更多