UML でネスト/サブクラスを適切にモデル化するにはどうすればよいでしょうか?
-
13-09-2019 - |
質問
UMLをいじってみました
私の主な経歴はプログラマーではなく、システム管理者です。
クラス モデルをより深く理解するために、xmdomain.cfg ファイルと Xen ハイパーバイザーを UML でマッピングしようとしています (マニュアル ページは次の場所にあります)。 http://linux.die.net/man/5/xmdomain.cfg)
それで、それを解決した後、私はこのような基本的なスタートを切ります(これは属性のみであり、アクションではないことに注意してください)
xenDomU:[
- kernelImage
- initialRamdisk
- allocatedMemory
- rootDevice
- nicAmount
- domuName
]
次のような状況は本当に厄介です
「disk」と「vif」はどちらも domu 設定ファイル内で複数回出現する可能性があります。(「disk」は 1 回から無限回、「vif」は 0 回から無限回出現できます) 本質的には、それらはクラス自体です
disk:[
- backendDevice
- frontendDevice
- deviceAccessMode
]
virtualNetworkInterface:[
- networkBridgeDevice
- interfaceIP
- macAddress
- interfaceName
]
さらに、「ドメイン シャットダウン オプション」は実際には 3 つの値ですが、実際には 1 つの属性として要約するのが最適ですが、その場合は上記と同じ状況になります。
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
}
]
これを行うには「より良い」方法があると確信していますが、これが私にとって最も自然だと思われる方法です。
誰かが私を啓発し、これを行うための正しい方法を示してくれませんか。
解決
shutdownOptions の場合は、クラスではなく列挙型にします。これらのオプションのいずれかを持つオブジェクトのクラスで、そのタイプの属性を宣言する必要があります。
クラスではネストされた分類子 (UML 2.3、9.3.1) が許可されていますが、ディスクと VIF は同じパッケージ内のスタンドアロン クラスとし、メイン クラスでディスクと VIF の集約を宣言する必要があるというガブリエルの意見に私は同意します。ネストされたクラスは、ネストされた分類子を外の世界から隠したい場合に興味深いものになりますが、これはめったに起こりません。
または、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.
他のヒント
なぜ Disk と VIF を通常のクラスとして使用し、関連付けを作成できないのか理解できませんでした。私の知る限り、UML は入れ子になったクラスをサポートしていません。ただし、場合によっては、パッケージをネストしたいクラスとネストしたいクラスに関連付けることができます。