衍生資訊

2003 年 12 月 25 日

如何在 UML 中表示衍生資訊?

考慮一個簡單的範例,您有一個類別代表一個矩形,您想要知道它的高度、寬度和面積。您如何顯示面積可以從高度和寬度衍生出來?

一個常見的方法是將高度和寬度顯示為屬性,而面積顯示為運算。人們這樣做是因為這是他們會實作的方式;高度和寬度的欄位,以及計算面積的方法。

UML 也有衍生屬性的表示法,您可以在名稱前面加上「/」。因此,您可以將它用於面積。

這兩種方法都是合理的,不同的團隊會做不同的事情。有些人只將屬性用於欄位;這些團隊不使用衍生表示法,或者僅在衍生資訊快取在欄位中時才使用。其他人則在遵循與欄位相同的衍生值命名標準時使用衍生標記,例如 getArea() 運算,或在 C# 或 Ruby 等語言中使用屬性。

我的偏好是對此有稍微不同的想法。物件的一個關鍵屬性是它們是封裝的。如果我是矩形類別的使用者,我實際上不應該知道或關心周長是如何計算出來的。實作人員可能會儲存高度和周長並計算寬度 - 我不應該能夠分辨。因此,這會導致我在實作中對欄位和衍生資訊使用相同的命名慣例,並將它們全部表示為類別圖上的屬性。

這是否表示我不使用衍生標記?實際上並非如此。我很樂意將圓周標記為衍生,但這表示三個值之間存在限制,它並未指定計算什麼以及儲存什麼。因此,在類似的論點中,我會說,如果三角形有三個邊屬性,將其中一個標記為衍生是合理的。

事實上,採取哪種方法並不重要,重要的是在團隊中遵循一致的樣式。還必須記住,不同的人做不同的事情,因此這是您在查看外來圖表時需要弄清楚的事情。(由於這種解釋不一致,我使用衍生的次數低於我在書中所使用的次數。)這是 UML 不如它所希望的那麼嚴謹的許多情況之一。