2009-06-12 11 views
3

J'ai joué avec UMLComment modéliser correctement les classes imbriquées/sous-classes dans UML?

Mon expérience principale est celle d'un sysadmin, pas en tant que programmeur.

Afin d'obtenir une meilleure compréhension des modèles de classe que j'ai essayé de faire tracer le fichier xmdomain.cfg l'hyperviseur Xen dans UML (vous pouvez trouver la page de manuel à http://linux.die.net/man/5/xmdomain.cfg)

Alors après avoir travaillé it out i obtenir un début de base comme celui-ci (note, c'est les attributs, et non des actions)

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

la situation suivante a été une vraie douleur dans le cul

"disque" et "VIF" peut Les deux se produisent plusieurs fois dans un fichier de configuration domu. (« Disque » peut se produire 1 à temps infinis et « VIF » 0 à temps infinis) essentiellement ce sont des classes elles-mêmes

disk:[ 
    - backendDevice 
    - frontendDevice 
    - deviceAccessMode 
] 

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

En outre, « les options d'arrêt de domaine » sont vraiment 3 valeurs, mais il est en fait le mieux summorized comme attribut unique, mais vous obtenez la même situation que ci-dessus. Donc, après cela, vous vous retrouvez avec quelque chose qui ne me semble vraiment pas un UML valide.

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

Je suis sûr qu'il existe des moyens « meilleurs » de le faire, mais c'est ce qui semble être le plus naturel pour moi.

Quelqu'un pourrait m'éclairer et montrer la bonne façon de le faire.

Répondre

1

Pour les options shutdownOptions, vous voulez en faire une énumération au lieu d'une classe. Vous devez déclarer un attribut de ce type dans la classe pour les objets qui auront l'une de ces options. Bien que les classes autorisent les classificateurs imbriqués (UML 2.3, 9.3.1), je suis d'accord avec Gabriel que Disk et VIF devraient être des classes autonomes dans le même paquet, avec votre classe principale déclarant des agrégations de disques et de VIFs. Les classes imbriquées sont intéressantes lorsque vous souhaitez masquer ce classificateur imbriqué du monde extérieur, ce qui est rarement le cas.

alt text

Or dans la notation TextUML (qui a généré le diagramme ci-dessus):

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

Je ne comprenais pas pourquoi vous ne pourriez pas avoir le disque et VIF comme classes régulières et créer des associations. Pour autant que je sache, UML ne supporte pas les classes imbriquées. Cependant, dans certains cas, vous pouvez associer un package à des classes que vous souhaitez imbriquer dans la classe dans laquelle vous souhaitez effectuer l'imbrication.

Questions connexes