Рабочие процессы блок-схемы

Блок-схемы лежат в основе широко известного принципа разработки программ. Действие «Блок-схема» обычно используется для реализации непоследовательных рабочих процессов, но если не требуются узлы FlowDecision, то может использоваться для реализации последовательных рабочих процессов.

Структура рабочего процесса блок-схемы

Действие Flowchart представляет собой действие, содержащее набор действий, которые будут выполнены. Блок-схемы также содержат элементы управления потоком, такие как FlowDecision и FlowSwitch<T>, контролирующие выполнение между содержащимися действиями на основании значений переменных.

Типы узлов потока

Используются различные типы элементов в зависимости от типа управления потока, требуемого при выполнении элемента. К типам элементов блок-схемы относятся следующие:

  • FlowStep - моделирует один шаг выполнения в блок-схеме.

  • FlowDecision - создает ветвь выполнения на основе логического условия, такого как If.

  • FlowSwitch - обеспечивает ветвление в ходе выполнения на основе переключателя с неперекрывающимися ветвями, такого как Switch<T>.

Каждая ссылка имеет свойство Action, определяющее действие ActivityAction, которое может быть использовано для выполнения дочерних действий, а также одно или несколько свойств Next, которые определяют элемент или элементы, выполняемые после завершения выполнения текущего элемента.

Создание базовой последовательности действий с узлом FlowStep

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

<Flowchart>
  <FlowStep>
    <Assign DisplayName="Get Name">
      <Assign.To>
        <OutArgument x:TypeArguments="x:String">[result]</OutArgument>
      </Assign.To>
      <Assign.Value>
        <InArgument x:TypeArguments="x:String">["User"]</InArgument>
      </Assign.Value>
    </Assign>
    <FlowStep.Next>
      <FlowStep>
        <WriteLine Text="Hello, " & [result]/>
      </FlowStep>
    </FlowStep.Next>
  </FlowStep>
</Flowchart>

Создание условной блок-схемы с узлом FlowDecision

Чтобы смоделировать узел условного потока на блок-схеме рабочего процесса (т. е. создать ссылку, работающую аналогично символу принятия решения на стандартной блок-схеме), следует использовать узел FlowDecision. Для свойства Condition узла задано выражение, которое определяет условие, а для свойств True и False заданы экземпляры FlowNode, которые будут выполняться, если результатом вычисления выражения будет true или false. В следующем примере показано определение рабочего процесса, который использует узел FlowDecision.

<Flowchart>
  <FlowStep>
    <Read Result="[s]"/>
    <FlowStep.Next>
      <FlowDecision>
        <IsEmpty Input="[s]" />
        <FlowDecision.True>
          <FlowStep>
            <Write Text="Empty"/>
          </FlowStep>
        </FlowDecision.True>
        <FlowDecision.False>
          <FlowStep>
            <Write Text="Non-Empty"/>
          </FlowStep>
        </FlowDecision.False>
      </FlowDecision>
    </FlowStep.Next>
  </FlowStep>
</Flowchart>

Создание эксклюзивного коммутатора с помощью узла FlowSwitch

Чтобы смоделировать блок-схему, в которой на основе соответствующего значения выбирается один из взаимоисключающих вариантов пути, используется узел FlowSwitch<T>. Свойство Expression имеет значение Activity<TResult> с параметром типа Object, который определяет значение для сопоставления с выбираемыми элементами. Свойство Cases определяет словарь ключей и объектов FlowNode для сопоставления с условным выражением и набор объектов FlowNode, которые определяют направление выполнения в случае, если заданный вариант соответствует условному выражению. FlowSwitch<T> также определяет свойство Default, которое определяет направление выполнения при отсутствии соответствий условному выражению. В следующем примере показано, как определить рабочий процесс, который использует элемент FlowSwitch<T>.

<Flowchart>
  <FlowSwitch>
    <FlowStep x:Key="Red">
      <WriteRed/>
    </FlowStep>
    <FlowStep x:Key="Blue">
      <WriteBlue/>
    </FlowStep>
    <FlowStep x:Key="Green">
      <WriteGreen/>
    </FlowStep>
  </FlowSwitch>
</Flowchart>