我正在使用Sparx EA(当前版本)将一个简单的小测试解决方案逆向工程到类图(C#,如果重要的话)。只有两个班级。 Test1和Test2。 Test1有一个属性;
public List<Test2> test2list { get; set; }
基于该属性,我希望EA推断这两个类是相关的并相应地更新图表,但它没有..我只得到两个类并且必须手动链接它们。
有没有办法让EA识别关系?
答案 0 :(得分:4)
首先,我认为问题评论中的讨论突出了潜在的问题:关于UML中哪些关系对应于实现语言X中的哪些结构,没有达成共识。
换句话说,最常见的实现语言没有标准化的UML配置文件。 (Java有一个非常古老的版本,但它已经过时了。)我认为这是UML的一个重大缺陷,而不是任何特定工具中的问题。
回答这个问题:不,EA在这种情况下不会推断出依赖关系或用法。但问题更深入:EA无法正确解析模板类型。
扩展您的示例,请考虑以下四种情况:
public List<Test2> test2ListProp { get; set; }
public List<Test2> test2ListAttr;
public Test2 test2SingleProp { get; set; }
public Test2 test2SingleAttr;
EA识别属性,它表示为操作 - 而不是属性。它不会为这些创建任何连接器。另一方面,非属性的属性在模型中由属性和有向关联表示。使用这种方式的属性和有向关联在UML中在语义上是等价的,但是同样不适用于操作。
如果您现在进入模型并重命名Test2,您将看到EA正确更新属性和属性中非列表类型的名称,但其他人保留其List<Test2>
类型。所以这就是它破裂的地方; List<Test2>
类型只是一个字符串,而不是正确的模型引用。
您还应注意,定向关联test2ListAttr
具有多重性0 .. *。这是因为EA已正确推断此属性实际上是一个列表。可以在工具 - 选项 - C# - 其他集合类中控制此推断。
如果您现在从该选项中删除List<#TYPE#>;
,则在模型中创建模板类List
并重新导入(在这种情况下,最好先清除模型), EA将更改其test2ListAttr
的表示形式。它不是创建与Test2
的0 .. *定向关联,而是创建一个绑定到List
类的模板,指定Test2
作为实际参数。
这是一个正确的模型参考,如果你更改Test2
的名称,绑定将被更新(你可能需要重新加载图表) - 换句话说,这是一个正确的表示,如果你是要从这个模型生成代码,它将是正确的。实际上,通过这种方式设置选项并预先创建List类,上述四种情况中的三种情况的行为是正确的。
但是,这并不能解决类型为模板类的属性的问题。因为EA将它们表示为操作,所以它无法为它们绘制定向关联,因此,它也不会为它们绘制模板绑定。如果我是你,我应该将此报告为错误。
在相关的说明中,您可以让EA为操作返回和参数类型创建依赖关系(但不能用于模板类型用法)。这在工具 - 选项 - 源代码工程中设置。