派生信息
2003年12月25日
如何在 UML 中表示派生信息?
考虑一个简单的例子,你有一个表示矩形的类,你想知道它的高度、宽度和面积。如何显示面积可以从高度和宽度推导出?
一种常见的方法是将高度和宽度显示为属性,将面积显示为操作。人们这样做是因为这就是他们实现它的方式;高度和宽度的字段,以及一个计算面积的方法。
UML 还有一种表示派生属性的符号,你可以在名称前加上“/”。所以你可以用它来表示面积。
这两种方法都是合理的,不同的团队做不同的事情。有些团队只使用属性来表示字段;这样的团队不使用派生符号,或者只在派生信息被缓存到字段中时才使用它。其他团队在遵循与字段相同的派生值命名标准时使用派生标记,例如 getArea(
) 操作或在 C# 或 Ruby 等语言中使用属性。
我更倾向于从稍微不同的角度思考这个问题。对象的关键属性之一是它们是封装的。如果我是矩形类的用户,实际上我不应该知道或关心周长是如何计算的。实现者可能会存储高度和周长并计算宽度 - 我不应该能够分辨出来。所以这将导致我在实现中对字段和派生信息使用相同的命名约定,并在类图中将它们全部表示为属性。
这是否意味着我不会使用派生标记?实际上不是。我很乐意将周长标记为派生,但这表明这三个值之间存在约束,它没有指定哪个是计算的,哪个是存储的。所以,在类似的论证中,我会说,如果你有一个三角形的三个边属性,那么将其中一个标记为派生是合理的。
事实上,你采用哪种方法并不重要,重要的是你在团队中遵循一致的风格。同样重要的是要记住,不同的人做不同的事情,所以这是你在查看外来图表时需要弄清楚的事情。(由于这种解释的不一致,我在我的书中使用派生的次数比平时少。)这是 UML 比它想象的要少严格的众多情况之一。