2010-11-10 39 views
1

我正嘗試創建一個UML類圖和對應的類定義(例如C#或Java中),其中具有泛型關係層次結構以及基於這種一般關係但限制它的一個或多個專門類。如何限制使用UML或類定義的專用類中的多重性和其他屬性

例如,說我有以下一般UML關係(假裝它看起來像UML):

Router 
<> 1 
    | 
    | * 
Card 
<> 1 
    | 
    | * 
Port 

(讀作:路由器包含1個或更多的卡和每個卡包含一個或多個端口)

然後我想擴展它並定義一個專門的類,例如CiscoRouter。

Router <|---CiscoRouter 

此外,讓我們說一個CiscoRouter只能有1..10個卡。有沒有在模型中定義這種限制的方法?

我可以做類似如下:

Router <|---CiscoRouter 
<> 1   <> 1 
    |    | 
    | *   | 
Card ____________| 
<> 1 10  
    |    
    | *    
Port 

然而,這在技術上創造卡對象的兩個單獨集合,對不對?有關如何最好地定義這一點的任何建議?

實際的設計可能會更加複雜,因爲我們需要類,如Cisco7200Router,LinkSysRouter等以及定製卡,端口等。例如:

Router <|---CiscoRouter 
<> 1   <> 1 
    |    | 
    | *   | 10 
Card <|------CiscoCard 
<> 1   <> 1 
    |    | 
    | *   | 4 
Port <|------CiscoPort 

要添加其他的併發症,讓我們說路由器有一個稱爲Weight的屬性。但是,在CiscoRouter中,我們希望將該屬性實際定義爲特定值,例如4磅(例如,我們的模型以某種方式聲明CiscoRouter重4磅,有10個卡,每個卡有4個端口)。我如何定義這個?

我知道我可以在使用抽象類,方法等代碼中做很多事情;但是我想知道是否有任何干淨的方法可以在模型或元數據中儘可能多地定義它,以便我可以從中生成一些設計文檔而不執行任何操作。

由於提前,

回答

1

我會說,通常最好的方式來表達對UML模型的約束時,語義不容易被UML模型元素建模是使用OCL約束。

+0

感謝您的好建議,實際上我剛開始探索這種可能性。但是,我擔心OCL本身相當複雜並且沒有被廣泛使用。 OCL限制似乎也與它們所限制的對象有些分離,我希望能找到有助於此的實際設計實踐。 – 2010-11-12 02:30:17

+0

OCL對於簡單任務來說相當簡單,尤其是當您可以用OOP,lambda表達式,集合和謂詞來思考時。 – 2010-11-12 06:51:37

+0

OCL是UML的標準和部分,我想說大多數人都對工具支持感到失望。在UML圖中,您可以將約束作爲獨立的東西,並通過特殊關係與對象連接。 OCL約束有上下文,它將它們連接到模型元素。說到建模,最好選擇最適合的工具。您可以將基數上的約束建模爲屬性,並動態檢查它,就像您可能實現它一樣。但是這需要另一個圖表,比寫一個簡單的約束更有效。 – 2010-11-12 07:03:38

相關問題