2009-06-12 93 views
3

我一直在玩UML如何正确建模UML中的嵌套/子类?

我的主要背景是一个系统管理员,而不是程序员。

为了更好地理解类的模型,我一直在努力做映射出xmdomain.cfg文件中UML的Xen管理程序的(你可以找到在http://linux.die.net/man/5/xmdomain.cfg手册页)

工作后,所以出来我得到一个基本的开始是这样的(注意,这是一个属性而已,没有行动)

xenDomU:[ 
    - kernelImage 
    - initialRamdisk 
    - allocatedMemory 
    - rootDevice 
    - nicAmount 
    - domuName 
] 

下面的情况一直在屁股真正的痛苦

“磁盘”和“VIF”能都在一个domu配置文件中出现多次。 (“磁盘”可能会出现1到无限的时间和“VIF” 0到无限次)基本上他们是类本身

disk:[ 
    - backendDevice 
    - frontendDevice 
    - deviceAccessMode 
] 

virtualNetworkInterface:[ 
    - networkBridgeDevice 
    - interfaceIP 
    - macAddress 
    - interfaceName 
] 

此外,“域关机选项”真的是3个值,但它是作为一个真正的最佳summorized单一属性,但是你会得到与上面相同的情况。

shutdownOptions{ 
    - onShutdown 
    - onReboot 
    - onCrash 
} 

所以在那之后,你最终得到的东西实际上并不是对我有效的UML。

xenDomU:[ 
    kernelImage 
    initialRamdisk 
    allocatedMemory 
    rootDevice 
    nicAmount 
    disk:[ 
     backendDevice 
     frontendDevice 
     deviceAccessMode 
    ] 
    domuName 
    virtualNetworkInterface:[ 
     networkBridgeDevice 
     interfaceIP 
     macAddress 
     interfaceName 
    ] 
    shutdownOptions{ 
     onShutdown 
     onReboot 
     onCrash 
    } 
] 

我确定有更好的方法来做到这一点,但这对我来说似乎是最自然的。

有人请赐教,并显示正确的方式来做到这一点。

回答

1

对于shutdownOptions,您希望使其成为枚举而不是类。您需要在类中为那些将具有其中一个选项的对象声明该类型的属性。尽管类允许嵌套的分类器(UML 2.3,9.3.1),但我同意Gabriel的说法,即Disk和VIF应该是独立的类在同一个包中,并且主类声明了Disks和VIF的聚合。当你想从外部世界隐藏嵌套的分类器时,嵌套类很有意思,这种情况很少见。

alt text

或在TextUML符号(其产生上述图):

package xen; 

class XenDomU 
    attribute domuName : String; 
    attribute kernelImage : any; 
    attribute initialRamdisk : any; 
    attribute allocatedMemory : any; 
    attribute rootDevice : any; 
    attribute nicAmount : any; 
    attribute shutdownMode : ShutdownOptions; 
    composition disks : Disk[*]; 
    composition interfaces : VirtualNetworkInterface[*]; 
end; 

class Disk 
    attribute backendDevice : any; 
    attribute frontendDevice : any; 
    attribute deviceAccessMode : any; 
end; 

class VirtualNetworkInterface 
    attribute networkBridgeDevice : any; 
    attribute interfaceIP : any; 
    attribute macAddress : any; 
    attribute interfaceName : any; 
end; 

enumeration ShutdownOptions 
     onShutdown, 
     onReboot, 
     onCrash 
end; 

end. 
2

我不明白你为什么不能将Disk和VIF作为常规类来创建关联。 据我所知,UML不支持嵌套类。但是,在某些情况下,您可以将包与想要嵌套的类关联起来,并将其与要嵌套的类相关联。