如何在UML中正确建模嵌套/子类?

时间:2009-06-12 18:40:48

标签: class-diagram

我一直在玩UML

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

为了更好地理解类模型,我一直试图将xmdomain.cfg文件映射到UML中的xen hypervisor(你可以在http://linux.die.net/man/5/xmdomain.cfg找到手册页)

所以在解决之后我会得到一个像这样的基本开始(注意,这只是属性,而不是动作)

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

以下情况一直是屁股的真正痛苦

“disk”和“vif”都可以在domu配置文件中多次出现。 (“磁盘”可以发生1到无限次,“vif”0发生到无限次)基本上它们本身就是类

disk:[
    - backendDevice
    - frontendDevice
    - deviceAccessMode
]

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

此外,“域关闭选项”实际上是3个值,但它实际上最好将其作为单个属性进行汇总,但随后您将获得与上述相同的情况。

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
    }
]

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

有人可以请教导我并指出正确的方法。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

对于shutdownOptions,您希望将其设为枚举,而不是类。您需要在类中为具有其中一个选项的对象声明该类型的属性。

尽管类允许嵌套分类器(UML 2.3,9.3.1),但我同意Gabriel的观点,即Disk和VIF应该是同一个包中的独立类,主类声明了磁盘和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.