当 ChatGPT 发布时,我最初接触它纯粹是出于好奇。尽管我个人不编写代码,但我特别喜欢讨论代码生成的文章。我最初认为该功能与我无关。
然而,有那么一刻,我发现自己正在处理一个我不太急于创建的 UML 图。
为了简化或加快这个过程,我转向了各种方法。我通常使用 PlantUML 代码来制作 UML 图……在这里,我突然意识到:这是一种代码形式,并且可以生成代码。
因此,ChatGPT 逐渐成为我创建图表的宝贵工具,现在我很高兴与您分享我的经验。
UML代表统一建模语言,它是一种用于指定、可视化、构建和记录软件系统工件的语言。 UML 借鉴了面向对象编程语言中的概念;拥有开发知识对于 UML 建模是有益的,但不是强制性的。
它主要旨在描述软件设计的各个方面,但它也提供了一组行为图来对业务或用户需求进行建模。
在我的角色中,我负责 IT 业务流程,特别专注于对其进行建模以进行分析、优化,并将其转换为清晰的格式以供开发人员实施。
在建模方面,我使用了各种方法和工具,其中之一就是 UML。
它的美妙之处在于——您不必成为一名软件工程师就可以使用 UML。我用它来导航通过软件实现的业务流程,但它的用途远不止于此——它的用途非常广泛,可以由处于不同开发阶段的各种角色应用。总而言之,尝试一下吧;你可能会发现自己爱上了它。
与任何图表一样,您可以轻松绘制它 - 它简单、方便、快捷,并提供过程和结果的清晰视图。有许多图形工具可用于此目的,我确实使用它们。然而,多亏了 PlantUML,我常常选择“代码”方法。
PlantUML是一种开源建模语言和工具,允许您基于纯文本语言生成图表。简单来说,您可以在 PlantUML 中编写代码来创建图表。
我喜欢在“创意模式”下绘制图表,但更多时候,我要么随后将它们转换为代码,要么直接编写代码。这有两个主要原因:
您可以更有效地插入、移动和删除图表中的块
更改所绘制图表中块的顺序通常会导致整个图表的修改,从而影响其他块和链接。使用代码时,您无需关心视觉方面;您只需关心视觉方面即可。您正在处理文本,PlantUML 会为您处理图形表示。
您可以使用和存储简单的文本文件,而不是处理图片
当遇到文档中的图表图像时,这尤其有用。质量可能会受到影响。无法继续使用此类图表,并且只能重新绘制它们,而不能编辑或扩展它们。
另一个显着的优势是ChatGPT 理解 PlantUML 并且可以生成代码,让您享受代码生成的好处并将其与 UML 无缝集成。下面我将分享一些我个人经历的例子。
您可以使用 PluntUML 的任何代码编辑器。我个人更喜欢其中的 Visual Studio Code 和 PlantUML 扩展。另一种方法是使用在线编辑器,例如https://plantuml.com或其他。
让我们为出租车应用程序创建一个用例图。
首先,我使用提示:
使用 https://plantuml.com/ru/use-case-diagram 中的语法,为出租车应用程序创建用例图
ChatGPT 生成代码:
@startuml left to right direction actor "Passenger" as passenger actor "Driver" as driver rectangle "Taxi App" { usecase "Request Ride" as request usecase "Cancel Ride" as cancel usecase "Track Ride" as track usecase "Payment" as payment passenger -- (request) passenger -- (cancel) passenger -- (track) passenger -- (payment) driver -- (track) driver -- (payment) (request) --> (cancel) (request) --> (track) (track) --> (payment) } @enduml
视觉视图:
这个想法很好,但只有四个案例似乎还不够。我请求添加其他案例并通过一些语法示例对其进行增强,因为 PlantUML 中没有类似的示例。迅速的:
添加更多情况,可以使用不同类型的链接如include、extends和generalization,语法:
(case1) .> (case2_includes_case1) : <<包含>>
(父级)<|--(子级)
(case1 扩展 case 2) .> (case2) : <<扩展>>
然后我多次询问
添加更多案例
再次提出一些具体要求来修复错误。
以下是 ChatGPT 的最终结果:
@startuml left to right direction actor "Passenger" as passenger actor "Driver" as driver rectangle "Taxi App" { usecase "Request Ride" as request usecase "Cancel Ride" as cancel usecase "Track Ride" as track usecase "Payment" as payment usecase "Rate Driver" as rate usecase "View Ride History" as history usecase "Select Ride Type" as selectType usecase "Provide Feedback" as feedback usecase "View Driver Information" as driverInfo usecase "Update Profile" as updateProfile usecase "Promo Code" as promoCode usecase "Emergency Assistance" as emergencyAssistance passenger -- (selectType) passenger -- (request) passenger -- (cancel) passenger -- (track) passenger -- (payment) passenger -- (rate) passenger -- (history) passenger -- (feedback) passenger -- (driverInfo) passenger -- (updateProfile) passenger -- (promoCode) passenger -- (emergencyAssistance) driver -- (track) driver -- (payment) driver -- (rate) (request) ---> (cancel) (request) ---> (track) (track) ---> (payment) (track) ---> (rate) (history) --> (payment) (rate) --> (payment) (rate) ---> (track) (cancel) --> (request) (selectType) --> (request) (feedback) --> (rate) (driverInfo) ---> (track) (updateProfile) --> (track) (promoCode) --> (payment) (emergencyAssistance) --> (track) } @enduml
我喜欢这些案例,但不喜欢它们之间的联系。所以,我稍微编辑了一下代码。
这是最终结果:
@startuml actor "Passenger" as passenger actor "Driver" as driver rectangle "Taxi App" { usecase "Request Ride" as request usecase "Cancel Ride" as cancel usecase "Track Ride" as track usecase "Payment" as payment usecase "Rate Driver" as rate usecase "View Ride History" as history usecase "Select Ride Type" as selectType usecase "Provide Feedback" as feedback usecase "View Driver Information" as driverInfo usecase "Update Profile" as updateProfile usecase "Promo Code" as promoCode usecase "Emergency Assistance" as emergencyAssistance passenger -- (selectType) passenger - (request) passenger -- (track) passenger -- (payment) passenger -- (history) passenger -- (rate) passenger -- (updateProfile) passenger -- (emergencyAssistance) driver - (request) driver - (payment) driver - (rate) (request) --> (track) (track) --> (payment) (track) --> (rate) (selectType) --> (request) (cancel) .> (request) : <<extends>> (rate) <.. (feedback) : <<include>> (payment) <..(promoCode) : <<include>> (driverInfo) .> (track) : <<extends>> } @enduml
当然,你可以结合更多的场景。例如,没有有关用户注册和登录的信息。此外,您可以引导 ChatGPT 创建与您的设计相关的图表。关键是你有一个可以使用的基础。
我有一个带有反向代理的图片存储解决方案的简单版本序列图:
@startuml participant Client boundary "Reverse Proxy" as Proxy participant Back participant FileStorage participant Admin actor Editor Editor -> Admin: Add picture Admin -> FileStorage: Add picture Client -> Proxy: Get picture Proxy -> Proxy: Check cache alt cash is not empty Proxy -->> Client: Return picture else cash is empty Proxy -> FileStorage: Recieve picture FileStorage --> Proxy: Picture Proxy -> Proxy: Save to cache Proxy -->> Client: Return picture end @enduml
让我们改进它。我的提示:
我正在设计一个用于存储和使用图像的解决方案,检查此图并在必要时进行编辑
ChatGPT 建议:
1. **Participant Name Clarification:** - Consider renaming "Back" to something more descriptive, like "Application Server" or a similar term that better represents the functionality. 2. **Actor Placement:** - Move the "Editor" actor to a more standard position, usually at the top. @startuml participant Client actor Editor boundary "Reverse Proxy" as Proxy participant ApplicationServer participant FileStorage participant Admin Editor -> Admin: Add picture Admin -> FileStorage: Add picture Client -> Proxy: Get picture Proxy -> Proxy: Check cache alt cache is not empty Proxy -->> Client: Return picture else cache is empty Proxy -> ApplicationServer: Receive picture ApplicationServer --> Proxy: Picture Proxy -> Proxy: Save to cache Proxy -->> Client: Return picture end @enduml
我不喜欢关于演员安排的观点,所以我把它放回去了;其他一切都很好。
然后我重复了几次提示:
检查此图并根据需要对其进行增强
并写出提示:
展示ApplicationServer如何从数据库获取图片
添加控制焦点
添加一些极端情况
为了最终确定它,我调整了控制焦点并对命名进行了一些更改。这是最终结果:
@startuml participant Client boundary "Reverse Proxy" as Proxy participant ApplicationServer database FileStorage participant Admin actor Editor Editor -> Admin: Add picture activate Admin deactivate Admin Admin -> FileStorage: Add picture activate FileStorage deactivate FileStorage Admin -> ApplicationServer: Store metadata activate ApplicationServer Client -> Proxy: Get picture activate Proxy Proxy -> Proxy: Check cache alt cache is not empty Proxy -->> Client: Return picture else cache is empty Proxy -> ApplicationServer: Receive picture request activate FileStorage ApplicationServer -> FileStorage: Retrieve picture from database alt picture not found in database FileStorage --> ApplicationServer: Picture not found deactivate FileStorage ApplicationServer -> Proxy: Notify picture not found Proxy -->> Client: Picture not found else FileStorage --> ApplicationServer: Picture data deactivate FileStorage ApplicationServer -> Proxy: Send picture to Proxy Proxy -> Proxy: Save to cache Proxy -->> Client: Return picture end end deactivate Proxy deactivate ApplicationServer deactivate Admin deactivate Editor @enduml
首先,您必须检查所有内容,因为“ChatGPT 可能会出错”。它并不是要取代您,而是要简化和优化您的工作的工具。
最常见的错误与 PlantUML 语法有关。有时,它发生在对话过程中,我必须修复它并让 ChatGPT 回到正确的轨道。
其次,我使用免费版本的ChatGPT 3.5,它有好有坏。有时,它的效果更糟,并且会针对相同的提示给出一些随机答案。
第三,ChatGPT 比其他图表更能理解某些图表。例如,序列图比用例图做得更好。
然而,尽管存在这些限制,ChatGPT 仍然是一个有价值的工具和出色的助手,能够提高您的效率并节省您的时间。
我在工作中永久使用 ChatGPT。如果您是经理、分析师、开发人员、测试人员或任何其他角色,则可以使用 UML。如果是这种情况,请考虑编写和生成 PlantUML 代码 — 它将节省您的时间并提高您的效率。
我希望我的经验对您有用并有所启发。谢谢你!