首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PlantUML -如何将私有方法表示为序列图中嵌套的直线

PlantUML -如何将私有方法表示为序列图中嵌套的直线
EN

Stack Overflow用户
提问于 2020-06-26 19:57:09
回答 2查看 1.3K关注 0票数 2

我正在使用PlantUML创建一个序列图,它描述了一个约会应用程序击中一个RestfulController (它使用一个服务类来处理数据)。

我想要做的是通过序列图来表示服务类的内部私有方法。

注意:这是伪代码,请不要考虑语义。

代码语言:javascript
运行
复制
class DatingApp {
    
    public void hitExternalApi() {
    }
}

代码语言:javascript
运行
复制
class DatingRestController {
    
    @Autowired
    public void DatingService;

    @GetMethod
    public Object processService() {
        return DatingService.findProfile();
    }
}

代码语言:javascript
运行
复制
class DatingService {

    public Object findProfile() {
        Object retValue = new Object(null, null);
        var variable1 = doSomething();
        var varable2 = doSomethingElse();
        return retValue(variable1, variable2);
    }

    private String doSomething() {
    }

    private String doSomethingElse() {
    }
}

PlantUML DSL文件:

代码语言:javascript
运行
复制
@startuml
DatingApp -> DatingRestController: hitExternalApi()
DatingRestController -> DatingService: processService()
DatingService -> DatingService: findProfile()
DatingService -> DatingService: doSomething()
DatingService -> DatingService: doSomethingElse()
DatingService -> DatingRestController: sent retValue
DatingRestController -> DatingApp: Send JSON
@enduml

我的第一张通行证:

如您所见,这看起来像是DateService类正在调用process()方法,然后调用doSomething()doSomethingElse()方法。

我如何表示doSomething()doSomethingElse()方法是从findProfile()生命线中调用的,而不是看起来像外部公共调用?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-26 20:14:51

您可以使用activatedeactivate来显示哪个对象是活动的,并使用返回函数调用。

下面是一个示例:

代码语言:javascript
运行
复制
@startuml
DatingApp -> DatingRestController: hitExternalApi()
DatingRestController -> DatingService: process()
activate DatingService
DatingService -> DatingService: doSomething()
DatingService -> DatingService: doSomethingElse()
DatingService --> DatingRestController
deactivate DatingService
@enduml

uml序列图没有显示私有/公共方法调用的规则,但是没有什么可以阻止您通过图例添加自己的规则,以澄清如何读取图形。例如,您可以使用颜色来表示私有规则。

代码语言:javascript
运行
复制
@startuml
legend top left
  <color blue> Blue calls</color> denote public method calls
  <color red> Red calls</color> denote private method calls
endlegend
DatingApp -[#blue]> DatingRestController: hitExternalApi()
DatingRestController -[#blue]> DatingService: process()
activate DatingService 
DatingService -[#red]> DatingService: doSomething()
DatingService -[#red]> DatingService: doSomethingElse()
DatingService -[#blue]-> DatingRestController
deactivate DatingService 
@enduml

颜色也可以用于激活线,但序列描述则要复杂一些:

代码语言:javascript
运行
复制
@startuml
legend top left
  <color blue> Blue activation </color> denote public method calls
  <color red> Red activation</color> denote private method calls
endlegend
DatingApp -> DatingRestController: hitExternalApi()
DatingRestController -> DatingService: process()
activate DatingService #blue

DatingService -> DatingService: doSomething()
activate DatingService #red
deactivate DatingService

DatingService -> DatingService: doSomethingElse()
activate DatingService #red
deactivate DatingService

DatingService --> DatingRestController


deactivate DatingService 
@enduml

票数 4
EN

Stack Overflow用户

发布于 2020-06-29 08:13:46

因此,经过多次尝试和错误之后,我查看了PlantUML文档,发现真正的问题是如何将私有方法调用表示/表示为嵌套生命线。

这是我的解决方案:

代码语言:javascript
运行
复制
@startuml
skinparam Shadowing false
title __Dating API Sequence Diagram__\n
caption \nVersion 1.0 - 6/26/2020 (Draft)\n
autonumber
activate DatingApp
DatingApp -> DatingRestController: hitExternalApi()
activate DatingRestController
DatingRestController -> DatingService: processService()
activate DatingService
DatingService -> DatingService: findProfile()
activate DatingService #90EE90
DatingService -> DatingService: doSomething()
DatingService -> DatingService: doSomethingElse()
deactivate DatingService
DatingService -> DatingRestController: return retValue
DatingRestController -> DatingApp: jsonPayload
deactivate DatingRestController
deactivate DatingApp
legend bottom right
Legend
|=Color |= Name |= Type |= Lifeline |
|<back:#FFFFFF>           </back>| DatingApp.hitExternalApi() | method | default |
|<back:#FFFFFF>           </back>| DatingRestController.processService() | method | default |
|<back:#FFFFFF>           </back>| DatingService.findProfile | method | default |
|<back:#90EE90>           </back>| DatingService.doSomething() | method | nested |
|<back:#90EE90>           </back>| DatingService.doSomethingElse() | method | nested |
endlegend
@enduml

下面是从IntelliJ IDEA生成的序列图:

doSomethingElse()方法是否仍然可以指向绿色嵌套管道,或者指向包含调用findProfile()方法的默认白色生命线的箭头是否正确?

PlantUML是一个很好的工具,我期待着越来越好地使用它,帮助这里的其他人解决他们的问题!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62602005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档