【问题标题】:Drawing Call Flow with sequence Diagram leads to ambiguity用序列图绘制调用流会导致歧义
【发布时间】:2010-09-21 11:26:16
【问题描述】:

我想在哪里画一个序列图

A -> B.run()
B.run() -> B.m1()
B.m1() -> B.m2()

到目前为止,我已经想出了这些。

http://i51.tinypic.com/eja5bl.jpg http://i52.tinypic.com/1449s3.jpg

但是在这里我不能清楚地提到 B.m2() 是由 B.m1() 调用的 相反,它看起来像 B.run() 串行调用 B.m1() 和 B.m2()。

------------- 编辑-----

这是我目前画的http://i55.tinypic.com/21276kk.jpg

那么我当前的图表还好吗?? 我想要的是这个。 (呼叫流程)

SpiritAdapter -> SpiritEngine::run(spirit:string, method:string, args[])
SpiritEngine::run(spirit:string, method:string, args[]) -> SpiritEngine::executeLogic(spirit:string, method:string, args[])
SpiritEngine::executeLogic(spirit:string, method:string, args[]) -> SpiritEngine::spirit(spirit:string, method:string, args[])
SpiritEngine::spirit(spirit:string, method:string, args[]) -> new SpiritAbstractor
SpiritEngine::executeLogic(spirit:string, method:string, args[]) -> SpiritAbstractor::method(args)
SpiritEngine::run(spirit:string, method:string, args[]) -> SpiritEngine::storeXDO()

【问题讨论】:

  • 是的,我知道 SpiritAdapter 构造函数是错误的
  • 如果是关于阅读图表,我看不出有什么问题。您的担忧/怀疑究竟是什么?
  • SpiritEngine::storeXDO() 需要单独的小条吗?我的意思是应该是Self Message 还是recursive Message?

标签: uml sequence-diagram


【解决方案1】:

您可以在 B.m2() 上添加一个小条,然后放置一个自指向箭头 for example。

Self message vs recursive call

【讨论】:

  • 我目前正在这样做。但它被称为递归消息。但是我的这些函数不是递归的。那么有那种小酒吧会好吗?或者我对术语Recursive 的想法有误,它实际上意味着相同的对象而不是相同的方法??
  • 查看更新的答案。结帐:visual-paradigm.com/VPGallery/diagrams/…
  • @user256007:“递归”术语具有误导性。 UML 中的自消息用于指示对象对自身的任何调用。不必是相同的方法。根据您的原始帖子,自我消息语法(如示例所示)是合适的。
  • @sfinnie:这不是误导。自我信息是指向自身的箭头;而递归是指向自我栏的箭头。查看自我消息(visual-paradigm.com/VPGallery/diagrams/…)和递归消息(visual-paradigm.com/VPGallery/diagrams/…)
  • ...所以回答@user256007 的原始问题:使用嵌套生命线习语来说明对象调用自身的不同方法是否合适?是的。
【解决方案2】:

uml 规范允许以可视方式显示嵌套调用:被调用生命线应覆盖在调用生命线上。参见例如在this example 中调用确定AvailableReport()。

你的工具是否支持当然是另一回事...

【讨论】:

  • 是的。但根据上述评论,“递归”具有误导性。这是一个自调用,不必是相同的方法。
【解决方案3】:

假设 ObjectA 有 3 个方法,分别称为 MessageOne()、MessageTwo() 和 MessageThree()。

它们之间的关系如下图所示

void ObjectA::MessageOne()
{
    MessageTwo();
}

void ObjectA::MessageTwo()
{
   MessageThree();
}

void ObjectA::MessageThree()
{
   // TODO
}

使用如下图所示的 Enterprise Architect,如果您选择 MessageThree() 调用,您将获得一个提高激活级别的选项。

一旦您选择了该选项(通过单击-> 箭头),您将获得满足调用堆栈序列图的确切图表(如下所示)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 2016-06-30
    • 2018-07-06
    • 2020-11-12
    • 2011-07-02
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多