Uml Sparx EA逆向工程和推断关系?

Uml Sparx EA逆向工程和推断关系?,uml,enterprise-architect,Uml,Enterprise Architect,我正在使用Sparx EA(当前版本)将一个简单的小测试解决方案逆向工程到一个类图(C#如果有关系的话)。只有两门课。Test1和Test2。Test1有一个属性 public List<Test2> test2list { get; set; } 公共列表test2list{get;set;} 基于该属性,我希望EA推断这两个类是相关的,并相应地更新图表,但事实并非如此。。我只得到两个类,必须手动链接它们 有什么方法可以让EA识别这些关系吗?首先,我认为问题注释中的讨论突出了潜

我正在使用Sparx EA(当前版本)将一个简单的小测试解决方案逆向工程到一个类图(C#如果有关系的话)。只有两门课。Test1和Test2。Test1有一个属性

public List<Test2> test2list { get; set; }
公共列表test2list{get;set;}
基于该属性,我希望EA推断这两个类是相关的,并相应地更新图表,但事实并非如此。。我只得到两个类,必须手动链接它们


有什么方法可以让EA识别这些关系吗?

首先,我认为问题注释中的讨论突出了潜在的问题:对于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;
public List test2ListProp{get;set;}
公共列表test2listatr;
公共Test2 test2SingleProp{get;set;}
公共测试2 Test2 SingleAttr;
EA识别属性,将其表示为操作,而不是属性。它不会为这些创建任何连接器。另一方面,非属性的属性在模型中由属性和定向关联表示。这种方式使用的Attibutes和定向关联在UML中语义上是等价的,但对于操作来说却不一样

如果现在进入模型并重命名Test2,您将看到EA正确地更新了属性和属性中非列表类型的名称,但其他类型保留了它们的
list
类型。所以这就是它断裂的地方;
列表
类型只是一个字符串,不是正确的模型引用

还应注意,定向关联
test2ListAttr
的多重性为0..*。这是因为EA正确地推断出该属性实际上是一个列表。这种推断可以在Tools-Options-C#-其他集合类中控制

如果你现在去删除
列表
从该选项,然后在模型中创建一个模板类
列表
,并重新导入(在这种情况下,首先清除模型可能是个好主意),EA将更改其
test2listtr
的表示形式。它将创建一个绑定到
List
类的模板,指定
Test2
作为实际参数,而不是创建一个指向
Test2
的0..*关联

这是一个正确的模型引用,如果您更改
Test2
的名称,绑定将被更新(您可能需要重新加载关系图)——换句话说,这是一个正确的表示,如果您要从该模型生成代码,它将是正确的。事实上,使用这种方式设置的选项和预先创建的List类,上述四种情况中有三种情况的行为是正确的

但是,这并不能解决类型为模板类的属性的问题。因为EA将它们表示为操作,所以它不能为它们绘制定向关联,因此,它也不会为它们绘制模板绑定。如果我是你的话,我应该把这当作一个bug来报告


请注意,您可以让EA为操作返回和参数类型创建依赖项(但不用于模板类型使用)。这是在工具-选项-源代码工程中设置的。

首先,我认为问题注释中的讨论突出了潜在的问题:对于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;
public List test2ListProp{get;set;}
公共列表test2listatr;
公共Test2 test2SingleProp{get;set;}
公共测试2 Test2 SingleAttr;
EA识别属性,将其表示为操作,而不是属性。它不会为这些创建任何连接器。另一方面,非属性的属性在模型中由属性和定向关联表示。这种方式使用的Attibutes和定向关联在UML中语义上是等价的,但对于操作来说却不一样

如果现在进入模型并重命名Test2,您将看到EA正确地更新了属性和属性中非列表类型的名称,但其他类型保留了它们的
list
类型。所以这就是它断裂的地方;
列表
类型只是一个字符串,不是正确的模型引用

还应注意,定向关联
test2ListAttr
的多重性为0..*。这是因为EA正确地推断出该属性实际上是一个列表。这种推断可以在Tools-Options-C#-其他集合类中控制

如果你现在去删除
列表
从该选项,然后在模型中创建一个模板类
列表
,并重新导入(在这种情况下,首先清除模型可能是个好主意),EA将更改其
test2listtr
的表示形式。而不是创建指向
Test2的0..*关联