【问题标题】:How to specify a List<MyCustomType> as a "Return Type" for a UML Interface Property如何将 List<MyCustomType> 指定为 UML 接口属性的“返回类型”
【发布时间】:2012-01-05 19:13:26
【问题描述】:

在我的 Visio 2007 UML 文档中,我无法弄清楚如何向返回通用 List&lt;MyCustomType&gt; 类型的接口添加操作。

例如:

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

为清楚起见,下面是 C# 代码示例:

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

    public class MyClass
    {
    }
}

这是我卡住的屏幕截图:

似乎将List&lt;MyClass&gt; 指定为我的返回类型的唯一方法是创建另一个明确写为List&lt;MyClass&gt; 的用户定义数据类型。如果是这样,那就这样吧。但是,我发布此内容是希望有更好/正确的方法来做到这一点。

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

【问题讨论】:

    标签: visio generic-list user-defined-types


    【解决方案1】:

    在类图属性>转到操作>选择您有兴趣更改的返回类型并单击属性。

    在下一个对话框中,您可以选择设置前缀List&lt; 和后缀&gt;

    这样您就可以将返回类型指定为List&lt;&gt;

    我在 Visio 2010 中看到此选项。但我不确定此选项在 Visio 2007 中是否可用。

    【讨论】:

    • 谢谢,库马尔。仅供参考 - Visio 2007 确实支持前缀/后缀返回类型表达式。
    【解决方案2】:

    在 UML 类图中没有 T1&lt;T2&gt; 这样的东西

    如果要指定方法返回多个值,正确的记法是:

    SomeMethod(data: String) : MyClass [*]
    

    这种表示法比 C# 使用的表示法强大得多。 List&lt;MyClass&gt; 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]
    

    不正确,尽管在互联网上被大量使用。

    【讨论】:

    • 虽然从学术角度来看您的答案是正确的,但使用List&lt;MyCustomType&gt; 作为返回类型的预期语义非常明确,那么为什么不允许务实的解决方案呢?仅仅因为Viso不支持吗? (接受的答案确实是一个非常丑陋的黑客,我当然会避免它)。
    • @DocBrown:我相信对于 Java 或 C# 程序员来说这很清楚。其他语言可能对泛型使用其他语法,并将A&lt;B&gt; 用于泛型以外的其他内容。在 UML 中使用适合于特定语言的构造对我来说似乎很尴尬,它应该与语言无关。
    • @DocBrown:这是一个有趣的评论。就我个人而言,我一直认为 UML 是一种以完全与语言无关的方式描述问题解决方案的方法,然后才以特定语言实现解决方案,利用它的力量并规避它的限制。这样,对我来说,UML 就是将应用程序从一种语言迁移到另一种语言时所保留的东西。
    • 我知道这是一篇旧文章,但是,如果您正在对现有系统进行建模,不要将其迁移到另一种语言,而是出于任何其他原因(例如理解它?)它相当有用以便能够区分实际的执行情况。使用 List 或 T[] 或 IEnumerable 等的人会产生很大的不同。
    • 感谢您发布此信息。我一直在寻找正确的方法来记录返回集合的操作,而不会太特定于语言。
    猜你喜欢
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多