Форум Сообщества Аналитиков

Общий раздел => Теория моделирования и нотации => Тема начата: Виталий И от 06 Мая 2024, 00:14:08

Название: Как правильно структурировать диаграмму классов в PlantUml?
Отправлено: Виталий И от 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
```
Название: Re: Как правильно структурировать диаграмму классов в PlantUml?
Отправлено: [прилетело НЛО и...] от 06 Мая 2024, 13:36:48
Вопрос, вероятно, по стилю оформления диаграммы.
Что если...

===
@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)
Название: Re: Как правильно структурировать диаграмму классов в PlantUml?
Отправлено: Виталий И от 06 Мая 2024, 14:08:25
Вопрос, вероятно, по стилю оформления диаграммы.
Что если...

===
@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)


Я плохо владею навыком построения диаграмм.

Я хотел бы получить что-нибудь в духе такого (см. картинку)

Ожидаемое оформление:
     - классы располагаются слево-направо;
    - соединительные лини перпендикулярные.

Только не знаю как правильно разместить базовый класс.
Хотел бы базовый класс вынести вверх или вниз...
Т.к. вправо предполагаются размести ь ещё классы.

Название: Re: Как правильно структурировать диаграмму классов в PlantUml?
Отправлено: [прилетело НЛО и...] от 06 Мая 2024, 14:30:19
Обычно, обсуждая диаграммы, рассматривают языковые (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
===
Название: Re: Как правильно структурировать диаграмму классов в PlantUml?
Отправлено: [прилетело НЛО и...] от 14 Мая 2024, 14:23:55
Мастера игры в 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
Название: Re: Как правильно структурировать диаграмму классов в PlantUml?
Отправлено: [прилетело НЛО и...] от 06 Января 2025, 21:13:22
По 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)