使用plantuml绘制流程图如何将结束标记集中到一处?

@startuml 爬虫
start
:输入url和callback;<
:将url转换为文件名filename;
:访问文件是否存在;
if (文件是否存在) then(是)
    :calback(null, filename, false);
    stop
else(否)
    :获取url对应的网页资源;
    if(是否获取成功) then(成功)
        :创建文件用于存储获取到的网页资源;
        if(创建文件是否成功) then(成功)
            :向文件中写入;
            if(写入是否成功) then(成功)
                :callback(null, filename, true);
                stop
            else(失败)
                :callback(error);
                stop
            endif
        else(失败)
            :callback:(error);
            stop
        endif
    else(失败)
        :callback(error);
        stop
    endif
endif
@enduml

image.png

阅读 1.4k
avatarAI BotBETA

在PlantUML中,如果你想要将多个stop语句(即流程图的结束标记)集中到一处,以便在视觉上呈现为一个统一的终点,PlantUML本身并不直接支持将多个stop合并为一个单一的图形元素。但是,你可以通过调整布局和注释来间接实现这一目标。

不过,对于你的具体需求,由于每个stop都伴随着一个callback调用,并且这些调用可能是基于不同错误情况的,所以将它们合并可能不是最佳选择,因为这可能会隐藏不同错误路径的信息。

然而,如果你只是想在视觉上将结束部分集中,并且不关心每个结束点的具体细节(尽管这通常不推荐),你可以考虑以下几种方法:

  1. 使用elseelseif简化逻辑
    虽然这不会改变stop的位置,但可以使流程图更加简洁,从而间接提高视觉集中性。
  2. 添加注释或标签
    在每个stop旁边添加注释或标签,说明它们都指向同一个“结束”状态,尽管在图上它们仍然是分开的。
  3. 使用end代替多个stop(但这并不适用所有情况):
    如果你的流程图逻辑允许,并且所有stop后的处理逻辑相同(或可以合并),你可以考虑使用单个end来结束流程,但通常这不适用于包含错误处理的流程。
  4. 使用隐藏的stop和显式的“结束”节点
    在PlantUML中,你可以定义一个“结束”节点(虽然它本身不执行stop),然后在所有实际的stop之前或之后,通过注释或箭头指向这个“结束”节点。然而,这并不会改变stop的实际位置,只是通过注释或箭头在视觉上表示它们指向同一个地方。
  5. 自定义图形
    使用PlantUML的自定义图形功能(如皮肤或自定义样式),你可能能够创建一个视觉上更统一的结束标记,但这需要对PlantUML的定制有深入了解。

由于PlantUML的设计主要是为了清晰表达流程逻辑,而不是为了美观或视觉上的统一性,因此建议保持每个stop的独立性,并通过清晰的注释和布局来传达流程的逻辑结构。如果你的目标是生成一个高度可视化和美观的流程图,可能需要考虑使用更专业的流程图绘制工具。

1 个回答

你是说像这样吗?
image.png

可以这么写(即将 end 移到 endif 之后):

@startuml
start
:输入url和callback;<
:将url转换为文件名filename;
:访问文件是否存在;
if (文件是否存在) then(是)
    :calback(null, filename, false);
else(否)
    :获取url对应的网页资源;
    if(是否获取成功) then(成功)
        :创建文件用于存储获取到的网页资源;
        if(创建文件是否成功) then(成功)
            :向文件中写入;
            if(写入是否成功) then(成功)
                :callback(null, filename, true);
            else(失败)
                :callback(error);
            endif
        else(失败)
            :callback:(error);
        endif
    else(失败)
        :callback(error);
    endif
endif
stop
@enduml

参见 https://pdf.plantuml.net/PlantUML_Language_Reference_Guide_zh...


更新:

根据文档(https://pdf.plantuml.net/PlantUML_Language_Reference_Guide_zh...),你可以试试使用水平线 (hline) 样式的判断结束样式。

@startuml
skinparam ConditionEndStyle hline
start
:输入url和callback;<
:将url转换为文件名filename;
:访问文件是否存在;
if (文件是否存在) then(是)
    :calback(null, filename, false);
else(否)
    :获取url对应的网页资源;
    if(是否获取成功) then(成功)
        :创建文件用于存储获取到的网页资源;
        if(创建文件是否成功) then(成功)
            :向文件中写入;
            if(写入是否成功) then(成功)
                :callback(null, filename, true);
            else(失败)
                :callback(error);
            endif
        else(失败)
            :callback:(error);
        endif
    else(失败)
        :callback(error);
    endif
endif
stop
@enduml

效果如下:
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏