Как правильно моделировать вложенные / подклассы в UML? - PullRequest
3 голосов
/ 12 июня 2009

Я играл с UML

Мой основной опыт - сисадмин, а не программист.

Чтобы лучше понять модели классов, я пытался отобразить файл xmdomain.cfg гипервизора xen в UML (справочную страницу можно найти по адресу 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 значения, но на самом деле их лучше всего суммировать как один атрибут, но тогда вы получите ту же ситуацию, что и выше.

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 ]

2 голосов
/ 14 января 2010

Я не понял, почему вы не можете использовать Disk и VIF как обычные классы и создавать ассоциации. Насколько я знаю, UML не поддерживает вложенные классы. Однако в некоторых случаях вы можете связать пакет с классами, в которые вы хотите вложить класс, в который вы хотите вложить.

1 голос
/ 27 декабря 2010

Для shutdownOptions вы хотите сделать его перечислением, а не классом. Вам необходимо объявить атрибут этого типа в классе для объектов, у которых будет один из этих параметров.

Несмотря на то, что классы допускают вложенные классификаторы (UML 2.3, 9.3.1), я согласен с Габриэлем в том, что 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.
...