我需要来自某些C ++文件的各种UML图(序列/协作,类,包和系统组件)。但是,这些文件是更大的编程框架中的插件。我已经尝试从Rational Rose 7(2002版本)生成UML,但我不是很有经验,我不确定RR是否根本无法生成图表,我做错了什么,或者图表无法正确呈现,因为源文件是插件而不是独立程序。我也尝试过Star Modeler但收效甚微,似乎没有关于如何生成这些模型的教程。
是否有一种简单,无懈可击的方式来获取C ++文件的UML图表?
答案 0 :(得分:1)
大多数UML工具仅支持C ++的子集。任何不包含C预处理器的UML工具都会遗漏大量信息,并且由于C ++的复杂性很容易让它们混淆。
UML工具中逆向工程的主要用例是往返工程 - 首先创建UML模型,然后生成代码,然后调整一点但不要太多,然后再次导入更改。
值得注意的是,C ++中有许多很多结构,它们在UML中没有任何直接表示。 C ++是一种多范式语言; UML是一种OO建模语言。有许多C ++惯用法映射到相同的UML构造(是一个复合的auto_ptr
还是一个值?是std::vector<int>
成员变量与参数化类的关联,或类型{{1的属性}})
所以简短的回答是否定的,没有简单的,防弹的方式从C ++获取UML图。
答案 1 :(得分:0)
我知道这不是回答这个问题,但你可以用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并且您正在为shell使用Bash,那么您可以像这样使用它:
ruby headers.rb *.cc |dot -Tpng >header_deps.png
这将导致标头依赖关系的png图像。你可以用类继承做类似的事情。您可以利用ctags来处理更复杂的场景。
最终结果?你重新发明了轮子并且玩得很开心。 :P
答案 2 :(得分:0)
如果您是Windows用户,可以尝试StarUML。虽然正如discussion here所说,项目似乎已经死了,程序在我的Windows 7机器上运行得很好。
我发现StarUML可以在一组C ++源代码文件中生成类及其继承关系的良好类图。但是,我无法让它在类之间产生任何关联链接。我还在学习StarUML,所以我可能在那里做错了。
另外,我不认为除了类图之外它不能反向工程,但它可能是你的开始。