【问题标题】:How can I generate imperative non-OOP python code from UML/SysML model?如何从 UML/SysML 模型生成命令式非 OOP python 代码?
【发布时间】:2021-05-10 15:36:37
【问题描述】:

我想生成基于 UML/SysML 的 python 代码。编码主要是命令式的——调用传递结果、切换状态和一些主要部分的函数。

如何创建一些简单的主程序,其中包含我的逻辑(同样是原语:一些输入收集功能、一些处理功能、一些输出写入器功能)?

在 Enterprise Architect 中,我认为没有类、对象等是不​​可能的。在这个接近硬件/功能安全的领域,不需要 OOP 的东西、继承、多态性。但似乎所有的活动图、序列图等都无法使用。有没有人建议如何使用基于模型的方法来弥补这一差距?

【问题讨论】:

  • 帧挑战。您确定行为代码生成是您想要的吗?业界似乎回避了这一点,因为在大多数情况下,实际编写代码比对其建模要容易得多。编写一个生成器是一项巨大的投资,只有在你可以将它用于许多项目时才会收回成本。对于单个项目,这永远不会具有成本效益。对于您的具体情况,没有现成的解决方案。
  • 在 EA 中,您可以创建自己的代码生成模板。你可以为 Python 创建它们。要在 EA 中使用代码生成,您需要使用类而不是活动图来创建模型,但是如果您创建适合您所针对的功能范式的类模型,我认为这没有理由不实际工作。您的行为代码必须嵌入到您在类中定义的操作中。
  • 正如吉尔特所说。建模和编码是两个世界。问题不是如何使它们成为一个世界,而是如何最好地在它们之间建立桥梁。我不建议将任何代码放入 UML 工具(尤其不是 EA)中,因为它们不是 IDE 的补充。 RE 在实践中不起作用。这只是鲜血、汗水和泪水。但是,可以让两者并肩工作以顺利进行。棘手,但可能。
  • 谢谢。是的——它不应该只针对一个项目。另一个原因是它涉及功能安全。在这里,您应该对更高的 ASIL(所谓的安全完整性级别)有更深入的理解和代码文档。从长远来看,如果软件和文档确实应该同步并且软件始终应该完全按照文档和图表等文档的说明进行操作,那么我认为没有任何替代方案可以提供单点故障/一个源。

标签: python uml modeling imperative-programming sysml


【解决方案1】:

1。如何在 UML 中建模一个固有的命令式/过程式设计?

如果您有如下处理流程:

一些输入收集功能,一些处理功能,一些输出写入功能

您可以使用activity diagrams 轻松设计它。它们拥有描述复杂处理所需的一切,将其分解为更小的步骤,无论它是由顺序部分还是并行部分组成。

活动图甚至允许您记录输入/输出数据流,这要归功于对象流(但您将使用数据结构而不是封装对象。

很可能,即使您不在 OOP 领域,您也会对数据结构感兴趣。在程序上,您通常定义一些数据结构,并具有一些旨在管理数据结构的功能。不过,它并不总是像 OOP 中那样清晰和封装,因为您可以轻松地让一个函数同时处理多个数据结构。

但您可以从将数据结构建模为类中受益,在轻量级图表中,最终无需任何操作,即使它不像 OOP 那样中心化。 p>

现在,如果您有一些非常专用于数据结构的函数/过程,没有什么能阻止您在 UML 类图中将它们指示为操作,即使它不是 OOP。至少它会表明某些函数/过程专用于某些数据结构。这通常在数据库建模中完成,其中纯数据表显示为好像它们是一个类,而与这些表相关的数据库触发器显示为操作,如果触发器根本不是 OOP,则显示为事件。

2。生成代码

对于您的语言,您可能找不到开箱即用的东西。我不确定您的需求对于主要针对 OOP 的 UML 工具制造商是否具有经济利益。

但是,生成 C 结构、Pascal 或 ADA 记录并不比生成 C++ 或 Java 类更难。如果工具制造商不提供它,你至少可以想象一些系统化。

活动图代码生成应该更直接,因为它的概念比其他 UML 概念更不了解 OO。

最后,状态图对您来说也是一个有趣的工具。许多代码生成器都在状态机上工作。 YACC、Lex、Bison 等实际上是用语言语法构建巨型状态机、自动生成状态转换表并从那里生成无人能手动生成的代码的工具。同样,这不是为 OO 世界保留的东西。

结论

UML 可以成为对您的设计进行建模的有用工具,即使您不在 OOP 中并且您的设计更加程序化。只是您会发现转向实施的自动化程度较低。 (但我的印象是代码生成和往返工程在 OOP 中也没有那么频繁)。

【讨论】:

  • 在上面评论后阅读您的答案。我本可以省去那份努力 ;-)
猜你喜欢
  • 2014-12-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2019-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多