4

我通常对 UML 感到很困惑,这种情况也不例外。假设我有一个接口 IAnimal,Food 和 Cat 类:

interface IAnimal {
    void Feed(Food food);
}

class Cat : IAnimal {
    void Feed(Food food) {
        //code
    }
}

我有 3 个关于为这 3 个元素绘制 UML 类图的问题:

  • 我认为我应该使用 IAnimal 和 Food 或 Cat 和 Food 之间的关联。关联线的一侧是否应该有箭头,如果有,那么在哪一侧,为什么会有?

  • 如果我在图表上将 Feed 作为 IAnimal 方法编写,我应该在 Cat 类中编写一个 Feed 方法还是只编写额外的 Cat 方法?

  • 最重要的是:应该在 IAnimal 和 Food、Cat 和 Food 之间建立关联,还是两者兼而有之?

4

5 回答 5

14

UML 定义了许多关系类型。

关系有许多不同的符号:

  • 关联关系具有可靠路径的基本符号
  • 依赖关系具有虚线箭头的基本符号
  • 泛化关系具有带有三角形箭头的实心路径的基本符号
  • 实现关系具有带三角形箭头的虚线箭头的基本符号(依赖和泛化的混合)

图文并茂

+---------------------------+
|       <<interface>>       |
|           IAnimal         |
+---------------------------+                        +--------+
| + Feed(food: Food) : void |- - - - <<use>> - - - ->|  Food  |
+---------------------------+                        +--------+
              ^
             /_\
              |

              |

              |
        +-----------+
        |    Cat    |
        +-----------+

那是:

  • IAnimal和之间的关系Food是一种使用关系。这显示为具有构造型 «use» 的依赖项
  • IAnimal和之间的关系Cat是一种实现关系。

关联关系用于表示两个或多个分类器之间的连接。这意味着至少有一个类具有另一种类型(或集合)的属性。事实上,属性和关联端包含相同的信息,并且可以互换。

因此,恕我直言,您描述的关系不应被建模为关联。

于 2009-01-02T18:54:09.483 回答
1

您对这类东西的挑剔程度在很大程度上取决于您首先使用 UML 的目的。

如果你有某种出色的 UML 到代码的翻译器,那么你需要很挑剔(但看起来你更喜欢代码而不是框和线——那么你为什么要使用这样的工具呢?)

如果您只是简单地使用 UML 与其他人交流,那么您可以稍微不那么挑剔。

Craig Larman 的“应用 UML 和模式”强调了这一点,它包含了看起来好像是在白板上绘制的图表。在那种图表中,UML 标准说应该用虚线画一条实线就可以了。所以用箭头等等。

我很清楚这条线应该从IAnimalFood

箭头是否增加了清晰度(对于人类读者)是一个选择问题,但它表示一种单向关系:

这篇介绍性文章中:

“在单向关联中,两个类是相关的,但只有一个类知道这种关系存在。”

于 2009-01-02T11:57:51.740 回答
0

假设一个类图,您应该在 IAnimal 和 Food 之间有一个“使用”关联,在 Cat 和 IAnimal 以及 Dog 和 IAnimal 之间有一个“is a”关联:

    IAnimal ----> Food
     ^   ^
    //   \\
   //     \\
 Cat      Dog
于 2009-01-02T11:52:56.010 回答
0

1) 接口 IAnimal 和类型 Food 之间不应写任何关联。关联仅用于将类型与类内部的属性联系起来。例如

class Animal
{
   Food foodEaten;
}

class Food
{
 //Implementation code
}

那么您应该编写一个关联来指示这两种类型之间的联系。

相反,您应该绘制一个依赖项,该依赖项指示接口 IAnimal 依赖于 Food 类型。依赖关系的绘制与上图中的关联相同,只是将直线改为虚线。

2)不,不要写那些方法,也不要写依赖。只在接口 IAnimal 上保留所有符号

于 2009-01-02T12:41:48.657 回答
0

我认为 IAnimal 会有 HAVE-A 食物,因为它是新陈代谢的,但如果你真的想表示 HAS-A,我认为它应该是一个聚合(空心菱形)或组合符号(用菱形填充),具体取决于级联删除特性。

根据 Martin Fowler 的说法,UML 有两种思想流派。有“草图师”,他们使用白板和奇怪的纸上的符号来与其他开发人员交流足够多的想法。

还有一些人将 UML 视为工程图纸,必须捕获设计的每一个最后细节。

我坚定地站在前阵营。作为一名前工程师,我可以从个人经验告诉你,UML 没有真实工程图的力量来完全捕捉软件设计。

如果您碰巧相信后者,请使用 UML 进行完整的桌面或 Web UI 设计并在此处发布。

于 2009-01-02T13:50:15.413 回答