如何将List<MyCustomType>指定为UML接口属性的“返回类型”

21

在我的 Visio 2007 UML 文档中,我无法确定如何向返回泛型 List<MyCustomType> 类型的接口添加操作。

例如:

假设我有一个名为 "MyClass" 的类和一个名为 "IFace" 的接口。IFace 具有返回 MyClass 的通用列表的方法签名。

为了清晰起见,以下是 C# 代码示例:

namespace StackO
{
    public interface IFace
    {
        List<MyClass> SomeMethod(string data);    
    }

    public class MyClass
    {
    }
}

以下是我卡住的截图: 在此输入图片描述

看起来似乎唯一指定List<MyClass>作为我的返回类型的方法是创建另一个用户定义数据类型,该数据类型显式写为List<MyClass>。如果是这种情况,那就这样吧。然而,我发布这篇文章希望有更好/更合适的方法。

如何将Visio界面的操作的返回类型定义为用户定义数据类型的通用列表?

2个回答

17
在类图属性中,转到操作>选择您想要更改的返回类型并单击属性。
在下一个对话框中,您将有设置前缀List<和后缀>的选项。
通过这种方式,您可以将返回类型指定为List<>
我在Visio 2010中看到了这个选项。但我不确定Visio 2007中是否有这个选项。

1
谢谢,库马尔。顺便说一下,Visio 2007确实支持前缀/后缀返回类型表达式。 - Jed

14

在UML类图中不存在T1<T2>这样的东西

如果您想指定该方法返回多个值,正确的表示法是:

SomeMethod(data: String) : MyClass [*]

这种符号比C#中使用的符号更加强大。List<MyClass> SomeMethod(string data)并没有提供关于方法契约的信息。使用UML,你可以了解到在:
SomeMethod(data: String) : MyClass [*]
SomethingElse() : String [1..*]
LastExample(number: UnlimitedNatural) : Integer [0..1]

SomeMethod 返回一个包含零个或多个元素的序列。 SomethingElse 返回一个包含一个或多个元素的序列:这个序列永远不会为空。最后,LastExample 返回一个可选值。在C#中可以表示为 int? LastExample(uint number) —注意,这里没有 IEnumerable

还要注意:

SomeMethod(data: String) : MyClass [0..*]

不应使用,因为[*]具有相同的含义并且更短。对于:

SomeMethod(data: String) : MyClass [0..n]

尽管在互联网上广泛使用,但这是不正确的。


2
尽管从学术角度来看,您的答案是正确的,但使用List<MyCustomType>作为返回类型的预期语义非常清晰,那么为什么不允许实用的解决方案呢?只是因为Viso不支持它吗?(接受的答案确实是一个极其丑陋的hack,我当然会避免使用它)。 - Doc Brown
1
@DocBrown:我相信对于Java或C#程序员来说,这是很清楚的。其他编程语言可能会使用不同的泛型语法,并且用"A<B>"表示除泛型之外的其他内容。在UML中使用特定语言的结构似乎很奇怪,因为它应该是与语言无关的。 - Arseni Mourzenko
1
@DocBrown:这是一个有趣的评论。就我个人而言,我一直认为UML是以完全与语言无关的方式描述问题解决方案的方法,然后再使用特定语言的功能并规避其限制来实现解决方案。因此,对我而言,当从一种语言迁移到另一种语言时,UML是需要保留的东西。 - Arseni Mourzenko
1
我知道这是一篇旧帖子,但是如果你正在对一个现有系统进行建模,而不是将其迁移到另一种语言,但出于其他任何原因(例如理解它),能够区分实际实现方式是非常有用的。无论使用List<T>还是T[]或IEnumerable<T>等,都可能会产生很大的差异。 - Dzyann
2
谢谢您发布这篇文章。我一直在寻找一种适当的方式来记录返回集合的操作,而不涉及具体的编程语言。 - Cypher
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接