Поделиться через


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

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

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

Активность блок-схемы — это активность, содержащая набор действий для выполнения. Блок-схемы также содержат такие элементы управления потоком, как 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>