Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
ru:rule:explicit_parallel_split [2024-08-24 15:57] – removed - external edit (Unknown date) 127.0.0.1ru:rule:explicit_parallel_split [2024-08-24 16:42] (текущий) – [Смотри также] Anatoly Belaychuk
Строка 1: Строка 1:
 +====== Делайте распараллеливание явным ======
  
 +{{tag>параллельная_развилка поток_управления}}
 +
 +Не изображайте несколько потоков управления, выходящих из действия или события.
 +===== ✔ Как надо =====
 +
 +<bpmnio type="bpmn">
 +<?xml version="1.0" encoding="UTF-8"?>
 +<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="sid-38422fae-e03e-43a3-bef4-bd33b32041b2" targetNamespace="http://bpmn.io/bpmn" exporter="http://bpmn.io" exporterVersion="0.10.1">
 +  <process id="Process_03hlcwi">
 +    <parallelGateway id="Gateway_0t7s84v">
 +      <incoming>Flow_02mmgfl</incoming>
 +      <outgoing>Flow_1fsucrx</outgoing>
 +      <outgoing>Flow_12ytfbn</outgoing>
 +    </parallelGateway>
 +    <task id="Activity_15pqard" name="Сделать это">
 +      <incoming>Flow_1fsucrx</incoming>
 +    </task>
 +    <sequenceFlow id="Flow_1fsucrx" sourceRef="Gateway_0t7s84v" targetRef="Activity_15pqard" />
 +    <task id="Activity_1gfp408" name="Сделать то">
 +      <incoming>Flow_12ytfbn</incoming>
 +    </task>
 +    <sequenceFlow id="Flow_12ytfbn" sourceRef="Gateway_0t7s84v" targetRef="Activity_1gfp408" />
 +    <task id="Activity_0zqkrvj" name="">
 +      <outgoing>Flow_02mmgfl</outgoing>
 +    </task>
 +    <sequenceFlow id="Flow_02mmgfl" sourceRef="Activity_0zqkrvj" targetRef="Gateway_0t7s84v" />
 +  </process>
 +  <bpmndi:BPMNDiagram id="BpmnDiagram_1">
 +    <bpmndi:BPMNPlane id="BpmnPlane_1" bpmnElement="Process_03hlcwi">
 +      <bpmndi:BPMNShape id="Gateway_150pa8t_di" bpmnElement="Gateway_0t7s84v">
 +        <omgdc:Bounds x="265" y="115" width="50" height="50" />
 +      </bpmndi:BPMNShape>
 +      <bpmndi:BPMNShape id="Activity_0zqkrvj_di" bpmnElement="Activity_0zqkrvj">
 +        <omgdc:Bounds x="120" y="100" width="100" height="80" />
 +        <bpmndi:BPMNLabel />
 +      </bpmndi:BPMNShape>
 +      <bpmndi:BPMNShape id="Activity_15pqard_di" bpmnElement="Activity_15pqard">
 +        <omgdc:Bounds x="350" y="20" width="100" height="80" />
 +        <bpmndi:BPMNLabel />
 +      </bpmndi:BPMNShape>
 +      <bpmndi:BPMNShape id="Activity_1gfp408_di" bpmnElement="Activity_1gfp408">
 +        <omgdc:Bounds x="350" y="180" width="100" height="80" />
 +        <bpmndi:BPMNLabel />
 +      </bpmndi:BPMNShape>
 +      <bpmndi:BPMNEdge id="Flow_1fsucrx_di" bpmnElement="Flow_1fsucrx">
 +        <omgdi:waypoint x="290" y="115" />
 +        <omgdi:waypoint x="290" y="60" />
 +        <omgdi:waypoint x="350" y="60" />
 +      </bpmndi:BPMNEdge>
 +      <bpmndi:BPMNEdge id="Flow_12ytfbn_di" bpmnElement="Flow_12ytfbn">
 +        <omgdi:waypoint x="290" y="165" />
 +        <omgdi:waypoint x="290" y="220" />
 +        <omgdi:waypoint x="350" y="220" />
 +      </bpmndi:BPMNEdge>
 +      <bpmndi:BPMNEdge id="Flow_02mmgfl_di" bpmnElement="Flow_02mmgfl">
 +        <omgdi:waypoint x="220" y="140" />
 +        <omgdi:waypoint x="265" y="140" />
 +      </bpmndi:BPMNEdge>
 +    </bpmndi:BPMNPlane>
 +  </bpmndi:BPMNDiagram>
 +</definitions>
 +</bpmnio>
 +===== ✘ Как НЕ надо =====
 +
 +Согласно [[https://www.omg.org/spec/BPMN/2.0.2/PDF | спецификации BPMN]], процесс на диаграмме ниже будет выполняться точно так же, как и процесс на диаграмме "как надо" выше: потоки будут исполняться параллельно. Разница только в том, что на диаграмме выше параллельность изображена явно, а на диаграмме ниже - неявно. Разумеется, логику процесса лучше изображать явно.
 +
 +<bpmnio type="bpmn">
 +<?xml version="1.0" encoding="UTF-8"?>
 +<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="sid-38422fae-e03e-43a3-bef4-bd33b32041b2" targetNamespace="http://bpmn.io/bpmn" exporter="http://bpmn.io" exporterVersion="0.10.1">
 +  <process id="Process_03hlcwi">
 +    <task id="Activity_15pqard" name="Сделать это">
 +      <incoming>Flow_1fsucrx</incoming>
 +    </task>
 +    <sequenceFlow id="Flow_1fsucrx" sourceRef="Activity_0zqkrvj" targetRef="Activity_15pqard" />
 +    <task id="Activity_1gfp408" name="Сделать то">
 +      <incoming>Flow_12ytfbn</incoming>
 +    </task>
 +    <sequenceFlow id="Flow_12ytfbn" sourceRef="Activity_0zqkrvj" targetRef="Activity_1gfp408" />
 +    <task id="Activity_0zqkrvj" name="">
 +      <outgoing>Flow_1fsucrx</outgoing>
 +      <outgoing>Flow_12ytfbn</outgoing>
 +    </task>
 +  </process>
 +  <bpmndi:BPMNDiagram id="BpmnDiagram_1">
 +    <bpmndi:BPMNPlane id="BpmnPlane_1" bpmnElement="Process_03hlcwi">
 +      <bpmndi:BPMNShape id="Activity_15pqard_di" bpmnElement="Activity_15pqard">
 +        <omgdc:Bounds x="380" y="20" width="100" height="80" />
 +        <bpmndi:BPMNLabel />
 +      </bpmndi:BPMNShape>
 +      <bpmndi:BPMNShape id="Activity_1gfp408_di" bpmnElement="Activity_1gfp408">
 +        <omgdc:Bounds x="380" y="180" width="100" height="80" />
 +        <bpmndi:BPMNLabel />
 +      </bpmndi:BPMNShape>
 +      <bpmndi:BPMNShape id="Activity_0zqkrvj_di" bpmnElement="Activity_0zqkrvj">
 +        <omgdc:Bounds x="240" y="100" width="100" height="80" />
 +        <bpmndi:BPMNLabel />
 +      </bpmndi:BPMNShape>
 +      <bpmndi:BPMNEdge id="Flow_1fsucrx_di" bpmnElement="Flow_1fsucrx">
 +        <omgdi:waypoint x="290" y="100" />
 +        <omgdi:waypoint x="290" y="60" />
 +        <omgdi:waypoint x="380" y="60" />
 +      </bpmndi:BPMNEdge>
 +      <bpmndi:BPMNEdge id="Flow_12ytfbn_di" bpmnElement="Flow_12ytfbn">
 +        <omgdi:waypoint x="290" y="180" />
 +        <omgdi:waypoint x="290" y="220" />
 +        <omgdi:waypoint x="380" y="220" />
 +      </bpmndi:BPMNEdge>
 +    </bpmndi:BPMNPlane>
 +  </bpmndi:BPMNDiagram>
 +</definitions>
 +</bpmnio>
 +
 +Поскольку на следующей диаграмме потоки управления надписаны ("если это", "если то"), у неискушенного пользователя может сложиться впечатление, что это взаимно-исключающие варианты. Нет, это по-прежнему неявное параллельное выполнение.
 +
 +<bpmnio type="bpmn">
 +<?xml version="1.0" encoding="UTF-8"?>
 +<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="sid-38422fae-e03e-43a3-bef4-bd33b32041b2" targetNamespace="http://bpmn.io/bpmn" exporter="http://bpmn.io" exporterVersion="0.10.1">
 +  <process id="Process_03hlcwi">
 +    <task id="Activity_15pqard" name="Сделать это">
 +      <incoming>Flow_1fsucrx</incoming>
 +    </task>
 +    <sequenceFlow id="Flow_1fsucrx" name="если это" sourceRef="Activity_0zqkrvj" targetRef="Activity_15pqard" />
 +    <task id="Activity_1gfp408" name="Сделать то">
 +      <incoming>Flow_12ytfbn</incoming>
 +    </task>
 +    <sequenceFlow id="Flow_12ytfbn" name="если то" sourceRef="Activity_0zqkrvj" targetRef="Activity_1gfp408" />
 +    <task id="Activity_0zqkrvj" name="">
 +      <outgoing>Flow_12ytfbn</outgoing>
 +      <outgoing>Flow_1fsucrx</outgoing>
 +    </task>
 +  </process>
 +  <bpmndi:BPMNDiagram id="BpmnDiagram_1">
 +    <bpmndi:BPMNPlane id="BpmnPlane_1" bpmnElement="Process_03hlcwi">
 +      <bpmndi:BPMNShape id="Activity_15pqard_di" bpmnElement="Activity_15pqard">
 +        <omgdc:Bounds x="380" y="20" width="100" height="80" />
 +        <bpmndi:BPMNLabel />
 +      </bpmndi:BPMNShape>
 +      <bpmndi:BPMNShape id="Activity_1gfp408_di" bpmnElement="Activity_1gfp408">
 +        <omgdc:Bounds x="380" y="180" width="100" height="80" />
 +        <bpmndi:BPMNLabel />
 +      </bpmndi:BPMNShape>
 +      <bpmndi:BPMNShape id="Activity_0zqkrvj_di" bpmnElement="Activity_0zqkrvj">
 +        <omgdc:Bounds x="240" y="100" width="100" height="80" />
 +        <bpmndi:BPMNLabel />
 +      </bpmndi:BPMNShape>
 +      <bpmndi:BPMNEdge id="Flow_1fsucrx_di" bpmnElement="Flow_1fsucrx">
 +        <omgdi:waypoint x="290" y="100" />
 +        <omgdi:waypoint x="290" y="60" />
 +        <omgdi:waypoint x="380" y="60" />
 +        <bpmndi:BPMNLabel>
 +          <omgdc:Bounds x="292" y="77" width="26" height="14" />
 +        </bpmndi:BPMNLabel>
 +      </bpmndi:BPMNEdge>
 +      <bpmndi:BPMNEdge id="Flow_12ytfbn_di" bpmnElement="Flow_12ytfbn">
 +        <omgdi:waypoint x="290" y="180" />
 +        <omgdi:waypoint x="290" y="220" />
 +        <omgdi:waypoint x="380" y="220" />
 +        <bpmndi:BPMNLabel>
 +          <omgdc:Bounds x="291" y="197" width="28" height="14" />
 +        </bpmndi:BPMNLabel>
 +      </bpmndi:BPMNEdge>
 +    </bpmndi:BPMNPlane>
 +  </bpmndi:BPMNDiagram>
 +</definitions>
 +</bpmnio>
 +===== Примечания =====
 +
 +  * Хотя [[https://www.omg.org/spec/BPMN/2.0.2/PDF | спецификация BPMN]] не запрещает несколько потоков управления, выходящих из одной задачи или события, велика вероятность, что такая конструкция будет неверно истолкована пользователями и поэтому ее рекомендуется избегать.
 +  * Некоторые авторы считают, что неявное распараллеливание позволяет сэкономить один элемент (параллельную развилку) и тем самым делает диаграмму проще. Этот аргумент представляется сомнительными, т.к. от развилки на диаграмме есть польза - она делает логику процесса более понятной.
 +===== Исключения =====
 +
 +  * В технике [[ru:rule:control_branch#Примечания | контрольного потока управления]] допускаются несколько потоков управления (рабочий и контрольный), выходящие из стартового события.
 +
 +===== Смотри также =====
 +
 +  * [[explicit_parallel_merge]]
 +  * [[do_not_use_conditional_flows]]
 +  * [[do_not_save_on_gateways]]
 +===== Автор(ы) =====
 +
 + --- //[[user:bell|Anatoly Belaychuk]] 2024-01-08 17:16//