State diagrams (Диаграмма состояний)

  • Mermaid визуализирует диаграммы состояний. Синтаксис диаграммы соответствует синтаксису, используемому в PlauntUML, поскольку это облегчит обмен диаграммами между Mermaid и PlantUML.

PlantUML - инструмент с открытым исходным кодом, позволяющий пользователям создавать диаграммы на простом текстовом языке.

UML - язык графического описания для моделирования бизнес-процессов и организационных структур.



  • Более старый синтаксис визуализации диаграмм.
  • На диаграммах состояний описываются системы, их состояния и то, как состояние системы может измениться на другое с помощью переходов.
  • На приведенном выше примере диаграммы, показаны три состояния: неподвижное, движущееся и аварийное. Работа с диаграммой начинается из состояния покоя. Из этого состояния, можно изменить состояние на подвижное. При работе с диаграммой можно изменить состояние, либо на неподвижное, либо на аварийное. Не предусмотрен переход от неподвижного состояния к аварийному.



Положения

  • Положение может быть представлено несколькими способами. Самый простой способ - определить идентификатор состояния в качестве описания.



  • Другой способ - использовать ключевое слово state с описанием, как показано ниже:



  • Также еще одним способом определения положения с описанием является определение идентификатора состояния, за которым следует двоеточие и описание



Переходы (взаимосвязи)

  • Переходы - это путь, при котором одно состояние переходит в другое. Это представлено с помощью текстовой стрелки -->



  • Когда вы устанавливаете переход между двумя состояниями, а они еще не определены, то они назначаются с идентификатором перехода. Позже, можно добавить описания к состояниям.
  • К взаимосвязи можно добавить текст для ее описания



Начало и конец диаграммы

  • Существует два специальных состояния, указывающих на начало и конец диаграммы. Они записываются с помощью синтаксиса *, и переход к нему определяет его либо как начальное, либо как конечное состояние



Составные состояния

  • При использовании диаграмм состояний часто создаются диаграммы, которые являются многомерными, поскольку одно состояние может иметь несколько внутренних состояний. В данной терминологии они называются составными состояниями.
  • Чтобы определить составное состояние, необходимо использовать ключевое слово state, за которым следует идентификатор и тело составного состояния между фигурными скобками {}. Взгляните на пример.



  • Также можно применить составные состояния в несколько уровней, используя представленный ниже синтаксис.
stateDiagram-v2
    [*] --> First

    state First {
        [*] --> Second

        state Second {
            [*] --> second
            second --> Third

            state Third {
                [*] --> third
                third --> [*]
            }
        }
    }


  • Помимо выше сказанного, существует возможность создавать переходы между составными состояниями. То есть при наличии нескольких составных состояний, можно создавать переходы (взаимодействия) между ними.
  • Для этого в синтаксисе диаграммы обозначить стрелками --> переходы, после этого описываются необходимые составные состояния.
stateDiagram-v2
    [*] --> First
    First --> Second
    First --> Third

    state First {
        [*] --> fir
        fir --> [*]
    }
    state Second {
        [*] --> sec
        sec --> [*]
    }
    state Third {
        [*] --> thi
        thi --> [*]
    }

Нельзя установить переходы между внутренними состояниями, принадлежащих разным составным состояниям.



Условия выбора

  • В некоторых случаях необходимо смоделировать выбор (условия) между двумя или более путями, это возможно выполнить при помощи оператора <<choice>>.
  • Обратите внимание на место оператора <<choice>> в синтаксисе диаграммы: ввести его нужно до введения основных условий.
stateDiagram-v2
    state if_state <<choice>>
    [*] --> IsPositive
    IsPositive --> if_state
    if_state --> False: if n < 0
    if_state --> True : if n >= 0



Разветвление

  • Можно указать разветвление на диаграмме, используя операторы <<fork>> и <<join>>.
stateDiagram-v2
    state fork_state <<fork>>
      [*] --> fork_state
      fork_state --> State2
      fork_state --> State3

      state join_state <<join>>
      State2 --> join_state
      State3 --> join_state
      join_state --> State4
з      State4 --> [*]


Заметки (примечания)

  • В некоторых случаях необходимо создать заметку на диаграмме. Для этого используется заметка Post-it note.

  • В примере ниже показано как поместить заметку справа или слева от узла.

     stateDiagram-v2
            State1: The state with a note
            note right of State1
                Important information! You can write
                notes.
            end note
            State1 --> State2
            note left of State2 : This is the note to the left.
    


Параллельность (одновременность)

  • Существует возможность создания параллелей с помощью символа  --.  При необходимости установки нескольких составных состояний параллельно друг другу, после создания состояния устанавливается символ  --.

    stateDiagram-v2
        [*] --> Active
    
        state Active {
            [*] --> NumLockOff
            NumLockOff --> NumLockOn : EvNumLockPressed
            NumLockOn --> NumLockOff : EvNumLockPressed
            --
            [*] --> CapsLockOff
            CapsLockOff --> CapsLockOn : EvCapsLockPressed
            CapsLockOn --> CapsLockOff : EvCapsLockPressed
            --
            [*] --> ScrollLockOff
            ScrollLockOff --> ScrollLockOn : EvScrollLockPressed
            ScrollLockOn --> ScrollLockOff : EvScrollLockPressed
        }
    


Установка направления диаграммы

  • Используя оператор direction, можно задать направление, в котором будет отображаться диаграмма.
  • К  данному оператору присоединяется символ, который задает направление диаграммы.
  •  В примере ниже обозначены символы LR, что соответствует направлению диаграммы слева-направо. Обратите внимание, что направление составного состояния устанавливается отдельно.
stateDiagram
    direction LR
    [*] --> A
    A --> B
    B --> C
    state B {
      direction LR
      a --> b
    }
    B --> D


  • Также для настройки направления диаграммы можно использовать следующие символы:

TD/TB - сверху-вниз;

BT - снизу-вверх;

RL - справа-налево;

LR - слева-направо.

Комментарии

  • Комментарии могут быть добавлены в диаграмму, которая будет проигнорирована синтаксическим анализатором.
  • Комментарии должны быть записаны в отдельной строке и начинаться с %% (двойные знаки процента).
  • Любой текст после начала комментария к следующей новой строке будет рассматриваться как комментарий, включая любой синтаксис диаграммы.
stateDiagram-v2
    [*] --> Still
    Still --> [*]
%% this is a comment
    Still --> Moving
    Moving --> Still %% another comment
    Moving --> Crash
    Crash --> [*]

Стили

  • Стилизация диаграммы выполняется путем определения ряда классов css. Во время визуализации эти классы извлекаются из файла, расположенного по адресу: src/themes/state.scss.

Пробелы в именах состояний

  • Пробелы можно добавить к состоянию, определив его вверху и сославшись на аббревиатуру.