【问题标题】:Need generated UML diagrams for C++ plugin modules需要为 C++ 插件模块生成 UML 图
【发布时间】:2010-05-06 22:53:34
【问题描述】:

我需要一些 C++ 文件中的各种 UML 图(序列/协作、类、包和系统组件)。但是,这些文件是更大编程框架中的插件。我尝试从 Rational Rose 7(2002 版)生成 UML,但我不是很有经验,我不确定 RR 是否根本无法生成图表,我做错了什么,或者图表没有正确呈现,因为源文件是插件而不是独立程序。我也尝试过 Star Modeler,但收效甚微,似乎没有关于如何生成这些模型的教程。

是否有一种简单、防弹的方法来获取 C++ 文件的 UML 图?

【问题讨论】:

    标签: c++ uml


    【解决方案1】:

    大多数 UML 工具仅支持 C++ 的一个子集。任何不包含 C 预处理器的 UML 工具都会遗漏大量信息,并且由于 C++ 的复杂性很容易混淆。

    UML 工具中逆向工程的主要用例是往返工程 - 首先创建 UML 模型,然后生成代码,然后稍微调整但不要太多,然后再次导入更改。

    同样值得注意的是,在 C++ 中有很多很多结构在 UML 中根本没有任何直接表示。 C++ 是一种多范式语言; UML 是一种面向对象的建模语言。有许多 C++ 习语映射到相同的 UML 结构(组合是 auto_ptr 还是值?std::vector<int> 成员变量是与参数化类的关联,还是 int[0..*] 类型的属性)

    所以简短的回答是否定的,没有简单、防弹的方法可以从 C++ 中获取 UML 图。

    【讨论】:

      【解决方案2】:

      我知道这不是在回答问题,但是您可以使用 graphviz dot 来模拟一些东西。为了激励,这里有一个生成点脚本的 Ruby 脚本,它本身可以用来生成表示头依赖关系的图像:

      puts "digraph {"
      ARGV.each_index do |i|
        File.open ARGV[i] do |f|
          while line = f.gets
            if line =~ /^#\s*include\s*[<"](.*)[>"]/
              puts "  \"#{File.basename ARGV[i]}\"->\"#{$1}\";"
            end
          end
        end
      end
      puts "}"
      

      如果脚本名为 headers.rb 并且您正在使用 Bash 作为您的 shell,那么您可以像这样使用它:

      ruby headers.rb *.cc |dot -Tpng >header_deps.png
      

      这将导致标题依赖项的 png 图像。你可以用类继承做类似的事情。您可以将 ctags 用于更复杂的场景。

      最终结果?你重新发明了轮子,并且玩得很开心。 :p

      【讨论】:

      • 这有点帮助,但我需要那些正式的 UML 图,而不是模型。
      • 谁能帮帮我?即使是只做类图的东西,或者关于如何使用程序来获得我需要的东西的教程,也会非常有用!
      【解决方案3】:

      如果您是 Windows 用户,您可以尝试StarUML。虽然正如discussion here 所说,该项目似乎已经死了,但该程序在我的 Windows 7 机器上运行得很好。

      我发现 StarUML 可以在一组 C++ 源代码文件中生成类及其继承关系的良好类图。但是,我无法让它在类之间产生任何关联链接。我还在学习 StarUML,所以我可能在那里做错了。

      另外,我认为它只能对类图进行逆向工程,但这对你来说可能是一个开始。

      【讨论】:

        猜你喜欢
        • 2011-03-10
        • 1970-01-01
        • 2017-07-08
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多