【问题标题】:Sparx EA reverse engineering and inferring relationships?Sparx EA 逆向工程和推断关系?
【发布时间】:2012-04-13 11:52:34
【问题描述】:

我正在使用 Sparx EA(当前版本)逆向工程一个简单的小测试解决方案到类图(C#,如果重要的话)。只有两个班。测试 1 和测试 2。 Test1 有一个属性;

public List<Test2> test2list { get; set; }

基于该属性,我希望 EA 推断这两个类是相关的并相应地更新图表,但事实并非如此。我只得到两个类并且必须手动链接它们..

有没有办法让 EA 识别这些关系?

【问题讨论】:

  • 您期待什么“关系”?充其量是有依赖性的。肯定没有关联。
  • 我会接受依赖,但为什么不会有关联?当然,它们相互依赖,因为一个使用另一个..
  • 关联是针对“Test1 has test2list”,而不是针对“Test1 has a list of Test2”。
  • 不会是 test1 通过关联类列表关联到 test2?
  • 这个例子中其实是三个类,不是两个——List是一个类,这里​​正确的关系是模板绑定。哪个EA可以做,但是属性做的不是很好。请参阅下面的答案。

标签: uml enterprise-architect


【解决方案1】:

首先,我认为问题 cmets 中的讨论突出了根本问题:对于 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&lt;Test2&gt; 类型。所以这就是它崩溃的地方; List&lt;Test2&gt; 类型只是一个字符串,而不是正确的模型引用。

您还应该注意,定向关联 test2ListAttr 的多重性为 0..*。这是因为 EA 已正确推断该属性实际上是一个列表。可以在工具 - 选项 - C# - 附加集合类中控制此推断。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多