
画图容易建模难我在做软件建模工具时重新想清楚的四件事最近我在持续做一款软件建模工具。从业务用例、泳道流程到系统分析和设计画布上的图形越来越丰富。图元能拖动、连线能调整、属性能编辑这些都是用户最容易看到的部分。但真正让我反复停下来思考的往往不是某个图形该怎么画而是一个更基础的问题用户画下的这个对象究竟是一张图上的形状还是工程里有独立身份的模型元素如果只是画图这个问题似乎不重要。每张图保存自己的节点、连线和坐标也能得到一幅看起来正确的图。可一旦同一个业务对象要出现在多张图里需求要沿不同阶段追溯图要保存、复用和分享问题就会集中出现。这篇文章不讨论哪种绘图库更好。我想结合这段产品实践谈谈做软件建模时需要先想清楚的四件事对象与视图、引用与映射、删除与一致性、工程与单图分享。一、同一个对象出现在两张图里算一个还是两个先看一个简化的例子。假设我正在分析“订单确认”业务一张业务用例图里有“订单确认”另一张流程图里也需要展示它。如果两张图各自保存一个名称相同的节点初期并没有明显问题。后来业务把名称改为“订单审核与确认”我就必须分别修改两处。再后来其中一张图补充了责任人另一张图仍保留旧描述。两张图开始讲不同的故事。因此在建模工具里我倾向于把模型元素和图中视图分开内容保存什么修改后的影响模型元素身份、名称、类型和业务属性同一元素的所有视图共同读取图中视图所属图、位置、尺寸、折叠状态等展示信息只影响当前图的呈现这样移动一个图元不会让其他图上的同一对象跟着移动修改对象名称则可以让引用它的图保持一致。关系也有类似区分两个对象之间是否有关联属于模型语义这条线在某张图上怎么走、标签放在哪里属于视图信息。这里最容易混淆的是“复制”。用户复制一个图元可能想在另一张图里继续展示同一个对象也可能想得到一个属性相似、但从此独立的新对象。两种操作必须有清楚的名字和结果。否则用户以为复制出的是新对象修改时却发现原图也变了或者以为是同一对象实际上两份数据已悄悄分叉。我的处理原则是默认复用时保留原对象身份需要独立副本时明确创建新对象。操作入口可以随具体图型调整但底层语义不能靠“名字一样”来猜。以下是我开发的建模工具融入了本人对软件建模的理解二、引用和映射解决的是两类不同问题把元素与视图区分之后下一步是厘清跨图、跨阶段的关系。引用表示“还是同一个对象只是在另一张图上展示”。例如一个业务角色同时出现在两张业务流程图中。它的身份不应因为换了一张图就改变图上的位置和展示方式却可以不同。映射表示“这是两个不同对象但存在来源或实现上的联系”。例如现状流程中的人工审核动作经过系统改造后可能对应未来流程中的自动校验、人工作出最终判断以及一个或多个系统用例。它们不能被强行当成同一个元素。否则现状与未来的差异会被抹平后续也说不清变化发生在哪里。我在设计建模链路时尤其注意这种区别同一业务对象跨图展示用引用不同阶段的对象需要说明来龙去脉用映射。从业务实体到领域实体再到数据库表也是如此。它们可能有关联但并非“一物三名”。业务实体描述业务上关心什么领域实体承担软件中的规则和状态数据库表承担存储结构。三者之间可能是一对多、多对一甚至有些对象在某一层没有直接对应物。因此追溯不能只靠名称匹配更不能默认每一层都是一对一。建模工具至少要保留明确的对象身份、映射类型和方向并允许人检查这条链路是否仍然成立当上游需求变化时下游哪些设计需要复核这也是我认为“可追溯”真正有价值的地方。它不是让图上多几条箭头而是让团队能够回答这个设计从哪里来如果这里改了哪些地方可能受影响。三、删除一个图元为什么会牵出一致性问题有了全局元素删除就不再是简单的键盘操作。如果用户在当前图上按下 Delete通常只是想把这个形状从图上移走。对象本身可能还出现在其他图里也可能暂时没有视图、但仍是工程里需要维护的模型对象。此时若直接把对象从仓库删除其他图上的引用、关系和追溯链就会断掉。所以我把两类动作分开从当前图移除删除当前视图保留模型元素和其他图上的视图。从模型中删除删除这个元素并处理它的全部视图、关系、映射及结构化引用。第二类动作的影响显然更大。执行前应告诉用户它会影响多少张图、多少条关系与映射执行时应作为一个完整事务处理撤销时也要能一次恢复而不是只把图形画回来底层引用却仍然断着。同样的要求适用于重命名、跨图引用和文件导入。建模工具不能只保证当前画布“看起来没问题”还要保证整个工程不存在悬空引用。保存前做结构和引用校验是一道必要的底线。从这个角度看模型一致性并非藏在后台的技术细节而是建模产品的核心体验。用户愿意长期维护模型前提是相信一次编辑不会悄悄破坏其他地方。四、分享一张图为什么不能直接截取工程文件当工程逐渐变大一个很自然的需求是把其中一张图交给别人或者导入另一个工程继续编辑。图片导出适合交流却无法继续编辑模型。直接从完整工程文件里截取该图的数据也有风险图里的对象可能引用图外关系、下钻流程、文档或映射。只复制看得见的节点和线导入后可能留下悬空引用把整个工程都带走又超出了“分享一张图”的目的。因此我把完整工程和可移植单图看成两种不同交付物。完整工程保留全部模型、跨图关系和追溯上下文单图文件只带走这张图能够独立成立的必要对象和关系。导入另一个工程时为这些对象重建身份作为新图追加而不是覆盖目标工程。这样的单图当然有边界图外下钻、跨图映射、工程文档和 AI 会话等内容不会自动跟随。需要完整追溯时仍应交换完整工程。这个限制必须明确告诉使用者不能因为单图导入成功就暗示原工程的全部语义也已经转移。这件事让我进一步确认“能导出”不等于“能无损往返”。对 JSON、XMI、PlantUML 或其他格式都一样应说明支持哪个版本、哪些图型和字段、哪些内容会丢失、导入后是否仍可编辑。把互操作边界讲清楚比笼统承诺“兼容各种工具”更可靠。五、AI 可以帮忙建模但不能替代语义确认现在做建模工具很难绕开 AI。我也在尝试让 AI 辅助访谈、整理需求并把结构化草案转成图。但前面四个问题不会因为有了 AI 就消失。AI 能根据对话建议创建哪些角色、用例和流程却不能仅凭一句自然语言就可靠地判断一个节点应当引用已有元素还是创建独立元素也不能在没有上下文和确认的情况下决定覆盖一张已有图。因此我更愿意把 AI 放在“提出可审阅草案”的位置先读取与当前任务有关的有限上下文给出对象、关系和依据再由人确认对象身份、连接方式及对现有图的影响最后由确定性的模型命令和校验规则落图。若已有图非空覆盖、另存版本后追加或直接追加也必须由用户明确选择。AI 的价值是帮助人更快发现遗漏、整理复杂信息。模型元素的身份、跨阶段语义和数据修改责任仍需要可检查的规则和人工判断承接。结语先确定模型含义再优化画图体验这段时间我在画布交互上做了不少细节调整连接点、泳道引用、时序消息、图形布局都需要打磨。它们直接影响建模效率不能忽略。但如果让我给正在设计建模工具的人一个建议我会先问四个问题同一个对象出现在不同图里系统如何知道它是同一个两个不同阶段的对象有关联时如何记录来源与变化移除图形和删除模型元素分别会影响哪些数据一张图离开原工程后哪些语义还能保留哪些必须明确舍弃这些问题回答清楚后画布交互、文件格式、AI 生成和导入导出才有稳定的落点。对我来说软件建模的价值最终不在于图画得有多快、多漂亮而在于业务变化发生时我们仍能看懂模型表达了什么知道该检查哪里并且有把握继续修改它。如果对这个软件感兴趣的可以评论区留言可以免费开通使用