我经常对UML感到困惑,这种情况也不例外。 假设我有一个接口IAnimal,类Food和Cat:
interface IAnimal {
void Feed(Food food);
}
class Cat : IAnimal {
void Feed(Food food) {
//code
}
}
我有3个关于为这3个元素绘制UML类图的问题:
我认为我应该使用IAnimal和Food或Cat and Food之间的关联。在关联线的一侧是否应该有箭头,如果是,那么在哪一侧以及为什么存在?
如果我在图上将Feed作为IAnimal方法编写,我应该在类Cat中编写方法Feed还是只编写其他Cat方法?
最重要的:IAnimal和食物,猫和食物之间的联系,还是两者兼而有之?
答案 0 :(得分:14)
UML定义了许多关系类型。
关系有许多不同的符号:
图示地
+---------------------------+
| <<interface>> |
| IAnimal |
+---------------------------+ +--------+
| + Feed(food: Food) : void |- - - - <<use>> - - - ->| Food |
+---------------------------+ +--------+
^
/_\
|
|
|
+-----------+
| Cat |
+-----------+
那是:
IAnimal
与Food
之间的关系是用法关系。
这显示为与构造型«use»IAnimal
与Cat
之间的关系是实现关系。关联关系用于指示两个或多个分类器之间的连接。这意味着至少有一个类具有另一个类型(或集合)的属性。事实上,属性和关联结束包含相同的信息,可以互换。
所以,恕我直言,你描述的关系不应该被建模为关联。
答案 1 :(得分:0)
假设有一个类,你应该在IAnimal和Food之间有一个“使用”关联,并且在Cat和IAnimal和Dog和IAnimal之间有一个“是”关联:
IAnimal ----> Food
^ ^
// \\
// \\
Cat Dog
答案 2 :(得分:0)
你对这类东西的挑剔程度在很大程度上取决于你最初使用UML的原因。
如果你有某种笨拙的UML代码转换器,那么你需要挑剔(但看起来你对代码比使用盒子和线更舒服 - 那你为什么要使用这样的工具呢? )
如果你只是简单地使用UML与其他人交流,那么你就可以不那么挑剔了。
Craig Larman的“应用UML和模式”强调了这一点,包括看起来好像已经在白板上勾勒出来的图表。在这种图表中,UML标准所说的实线应该是点缀的。所以用箭头等等。
我很清楚该行应该从IAnimal
转到Food
。
箭头是否增加了清晰度(对于人类读者来说)是一个选择问题,但它表明了单向关系:
“在单向关联中,两个 类是相关的,但只有一个 班级知道这种关系 存在“。
答案 3 :(得分:0)
1)接口IAnimal和Food类型之间不应该写任何关联。关联仅用于将类型与类中的属性连接起来。 E.G
class Animal
{
Food foodEaten;
}
class Food
{
//Implementation code
}
那么你应该写一个关联来指示这两种类型之间的联系。
你应该绘制的是一个依赖项,表明接口IAnimal依赖于Food类型。依赖关系与上图中的关联相同,只需将直线更改为虚线即可。
2)不,不要写那些方法,也不要写家属。仅将所有符号保留在Interface IAnimal
上答案 4 :(得分:0)
我认为IAnimal会有HAVE-A食物,因为它代谢了,但是如果你真的想要表示HAS-A我认为它应该是聚合物(空心钻石)或组成符号(填充钻石),取决于级联删除特征。
根据Martin Fowler的说法,UML有两种思想流派。有一些“草图”,他们使用白板上的符号和奇怪的纸张将他们的想法传达给其他开发人员。然后有些人将UML视为工程图纸,必须捕捉设计的每一个细节。
我坚定地参加了前营地。作为一名前工程师,我可以从个人经验告诉你,UML没有真正的工程图纸来完全捕捉软件设计。
如果您碰巧相信后者,请使用UML进行完整的桌面或Web UI设计并在此处发布。