Форум Сообщества Аналитиков
Общий раздел => Теория моделирования и нотации => Тема начата: Виталий И от 06 Мая 2024, 00:14:08
-
Как правильно структурировать диаграмму классов в PlantUml?
Пробую построить диаграмму классов в PlantUml, получаю кашу.
```cs
class MainViewModdel : BaseViewModdel
{
Entity1ViewModdel _entity1ViewModdel;
Entity2ViewModdel _entity2ViewModdel;
Entity3ViewModdel _entity3ViewModdel;
public MainViewModdel()
{
_entity1ViewModdel = new Entity1ViewModdel();
_entity2ViewModdel = new Entity2ViewModdel();
_entity3ViewModdel = new Entity3ViewModdel();
}
}
class Entity1ViewModdel : BaseViewModdel
{
+ Main(args: string[]): void
}
class Entity2ViewModdel : BaseViewModdel
{
+ Main(args: string[]): void
}
class Entity3ViewModdel : BaseViewModdel
{
+ Main(args: string[]): void
}
```
```cs
internal abstract class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string PropertyName = null)
{
// Код...
}
protected virtual bool Set<T>(ref T field, T value, [CallerMemberName] string PropertyName = null)
{
// Код...
}
}
```
# uml
```puml
skinparam linetype ortho
left to right direction
class BaseViewModel {
+ event PropertyChangedEventHandler PropertyChanged;
# virtual void OnPropertyChanged([CallerMemberName] string PropertyName = null)
# virtual bool Set<T>(ref T field, T value, [CallerMemberName] string PropertyName = null)
}
class MainViewModel {
- _entity1ViewModel : Entity1ViewModel
- _entity2ViewModel : Entity2ViewModel
- _entity3ViewModel : Entity3ViewModel
+ MainViewModel()
}
class Entity1ViewModel {
+ Main(args: string[]): void
}
class Entity2ViewModel {
+ Main(args: string[]): void
}
class Entity3ViewModel {
+ Main(args: string[]): void
}
BaseViewModel <|-- MainViewModel
BaseViewModel <|-- Entity1ViewModel
BaseViewModel <|-- Entity2ViewModel
BaseViewModel <|-- Entity3ViewModel
MainViewModel --> Entity1ViewModel
MainViewModel --> Entity2ViewModel
MainViewModel --> Entity3ViewModel
```
-
Вопрос, вероятно, по стилю оформления диаграммы.
Что если...
===
@startuml
class BaseViewModel {
+ event PropertyChangedEventHandler PropertyChanged
# OnPropertyChanged([CallerMemberName] string PropertyName = null):void {abstract}
# Set<T>(ref T field, T value, [CallerMemberName] string PropertyName = null):bool {abstract}
}
class MainViewModel {
+ MainViewModel()
}
class Entity1ViewModel {
+ Main(args: string[]): void
}
class Entity2ViewModel {
+ Main(args: string[]): void
}
class Entity3ViewModel {
+ Main(args: string[]): void
}
BaseViewModel <|-- MainViewModel
BaseViewModel <|-- Entity1ViewModel
BaseViewModel <|-- Entity2ViewModel
BaseViewModel <|-- Entity3ViewModel
Entity1ViewModel "_entity1ViewModel" <-- MainViewModel
Entity2ViewModel "_entity2ViewModel" <-- MainViewModel
Entity3ViewModel "_entity3ViewModel" <-- MainViewModel
@enduml
===
(http://www.plantuml.com/plantuml/png/dP5HIyCm4CVVyocE-TBXzc3xLgeCny2Ngk3mPGovBhSQkAQIf9KnzzrjfQXBHt6-XNz-lylTPMOT6bSLB3QCri8jMdfMz9wMaXZs0k0Ig2RjuD6KRsJSRlwAEYUvQCCxr9B9-7UDTG4Fsak3rHoveLCgCZBtMD0Qh3DAvzz-6y8rw8fv7DUbah37h65mumvVHP_89SkRmD0Mbh1Ln7BI76haYYPmPlsiBFbt_OFeTf2YqluEZh9W_0Clj5DkTtMA3z3aDkvwMAt7CRGZ-MhuVpKwJnNUxoOVq-dnO2S9Vy81A1o6_Aw5wAzlz49UD8AatsVtNjyB_-95VIyQz6QaPLNm9m00)
-
Вопрос, вероятно, по стилю оформления диаграммы.
Что если...
===
@startuml
class BaseViewModel {
+ event PropertyChangedEventHandler PropertyChanged
# virtual void OnPropertyChanged([CallerMemberName] string PropertyName = null)
# virtual bool Set<T>(ref T field, T value, [CallerMemberName] string PropertyName = null)
}
class MainViewModel {
+ MainViewModel()
}
class Entity1ViewModel {
+ Main(args: string[]): void
}
class Entity2ViewModel {
+ Main(args: string[]): void
}
class Entity3ViewModel {
+ Main(args: string[]): void
}
BaseViewModel <|-- MainViewModel
BaseViewModel <|-- Entity1ViewModel
BaseViewModel <|-- Entity2ViewModel
BaseViewModel <|-- Entity3ViewModel
Entity1ViewModel "_entity1ViewModel" <-- MainViewModel
Entity2ViewModel "_entity2ViewModel" <-- MainViewModel
Entity3ViewModel "_entity3ViewModel" <-- MainViewModel
@enduml
===
(http://www.plantuml.com/plantuml/png/dP51IyD048Nl-ok6UacnFPZSIfHYANY92XOlfSZKdSQ5oKHsDv6Y_dTJ2M8s9LXluULzR-RDpfr7wwk2rJEZSt2DZXuDlMMb9ePt1N0EL9DukBVbArc_NxoWvAIN1_46HJFPy5z3dK5jcbnag4kZuKu2IxHU83TeHiMMx2qMj07dhP7y9-mWmYL8nJpk96xBak61VBgwYYpjO0KxGwmdpKUDND44JWp_L6tx38q4xRjQzCky56_y_kAOFqARkraxSxqPpxwl4ABn_z7aD5G5xvf-JAVTOaSTOSC1Kpni2hTMgd--qHC5qWZI_fxjl3uN_uLB-bmooCr9T5Nm5m00)
Я плохо владею навыком построения диаграмм.
Я хотел бы получить что-нибудь в духе такого (см. картинку)
Ожидаемое оформление:
- классы располагаются слево-направо;
- соединительные лини перпендикулярные.
Только не знаю как правильно разместить базовый класс.
Хотел бы базовый класс вынести вверх или вниз...
Т.к. вправо предполагаются размести ь ещё классы.
-
Обычно, обсуждая диаграммы, рассматривают языковые (uml-ьные) конструкции, а не "бантики" -- что слева, что справа.
Я эту рисовалку увидело и попробовало сегодня. С Вашей подачи.
Добавляете свои директивы для стиля и получаете орто-линии + слева-направные классы.
[Обще]Принято, что суперкласс слева от своих потомков. Или сверху над своими потомками.
===
@startuml
skinparam linetype ortho
left to right direction
class BaseViewModel {
+ event PropertyChangedEventHandler PropertyChanged
# OnPropertyChanged([CallerMemberName] string PropertyName = null):void {abstract}
# Set<T>(ref T field, T value, [CallerMemberName] string PropertyName = null):bool {abstract}
}
class MainViewModel {
+ MainViewModel()
}
class Entity1ViewModel {
+ Main(args: string[]): void
}
class Entity2ViewModel {
+ Main(args: string[]): void
}
class Entity3ViewModel {
+ Main(args: string[]): void
}
BaseViewModel <|-- MainViewModel
BaseViewModel <|-- Entity1ViewModel
BaseViewModel <|-- Entity2ViewModel
BaseViewModel <|-- Entity3ViewModel
Entity1ViewModel "_entity1ViewModel" <-- MainViewModel
Entity2ViewModel "_entity2ViewModel" <-- MainViewModel
Entity3ViewModel "_entity3ViewModel" <-- MainViewModel
@enduml
===
-
Мастера игры в Plantuml живут на Stackoverflow. Советы, которые размещены там:
- пробовать замену "вертикальных" связей (с одинарным "-" в начертании) на "горизонтальные" (с двойным "--"). Например A <|- B vs A <|-- B
- пробовать менять местами правую и левую части. Например A <|- B vs B -|> A
- переупорядочивать строки или фрагменты в Plantuml-описании
- добавлять невидимые связи ради желаемого расположения элементов, которые ими связаны
- добавлять невидимые промежуточные пункты ради желаемого расположения сегментов связей (связь становится как бы цепью из звеньев)
Где-то там живет такая ссылка с продвинутыми магическими пассами: https://isgb.otago.ac.nz/infosci/mark.george/Wiki/wiki/PlantUML%20GraphViz%20Layout
-
По PlantUML есть длинное русскоязычное руководство "Неочевидный PlantUML", опубликованное в 4 частях:
1 часть (https://telegra.ph/non-obvious-plantuml-1-09-23)
2 часть (https://telegra.ph/non-obvious-plantuml-2-09-23)
3 часть (https://telegra.ph/non-obvious-plantuml-3-10-09)
4 часть (https://telegra.ph/non-obvious-plantuml-4-10-09)