Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия |
ru:rule:explicit_parallel_split [2024-08-24 15:57] – removed - external edit (Unknown date) 127.0.0.1 | ru:rule:explicit_parallel_split [2024-08-24 16:42] (текущий) – [Смотри также] Anatoly Belaychuk |
---|
| ====== Делайте распараллеливание явным ====== |
| |
| {{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// |