In breve
Hai capito bene.
A lungo
Analisi dello standard
15.3.3.3
lo dice molto chiaramente:
A ForkNode is a ControlNode that splits a flow into multiple
concurrent flows. A ForkNode shall have exactly one incoming
ActivityEdge, though it may have multiple outgoing ActivityEdges.
La cosa importante qui è che un ForkNode non può avere un margine di attività in uscita, perché ciò causerebbe un'incoerenza. Se una tale assurdità fosse possibile, il flusso di gettoni verrebbe interrotto, ma non finirebbe mai. Se è necessario terminare un flusso parziale, è necessario utilizzare un FlowFinalNode.
Se un ForkNode ha solo un'uscita, non è molto utile. Tuttavia, non creerebbe alcuna incoerenza:
|
----->|-----> is equivalent to ---------->
|
Allo stesso modo, 15.3.3.4
fornisce l'immagine completa:
A JoinNode is a ControlNode that synchronizes multiple flows. A
JoinNode shall have exactly one outgoing ActivityEdge but may have
multiple incoming ActivityEdges.
Il ragionamento è lo stesso di prima. È importante che ci sia almeno un input. Ci si aspetta che ne abbia diversi, ma se ce ne fosse solo uno, non causerebbe alcuna incoerenza.
La seguente frase nella stessa sezione, mostra anche che l'input multiplo è l'aspettativa, perché un and
ha bisogno di due operandi. Ma la riformulazione in testo semplice lo fa funzionare con un solo input:
If a JoinNode does not have a joinSpec, then this is equivalent to a
joinSpec Expression with the Boolean operator “and.” That is, the
implicit default joinSpec condition is that there is at least one
token offered on each incoming ActivityEdge.
Si noti che un join con un singolo input può avere uno scopo, a seconda di come è stato formulato il joinSpec, e specialmente se l'input è un ObjectFlow.
L'espressività
Avere un solo output su una fork non ha alcun effetto pratico sulla concorrenza (l'unico flusso è in concomitanza con se stesso). Se non lo sopporti, dovrai almeno accettare che non ha più effetto di avere un solo nodo iniziale , poiché 15.3.3.1
ci dice che:
If an Activity has more than one InitialNode, then invoking the
Activity starts multiple concurrent control flows, one for each
InitialNode.
Il fatto che UML consenta al modellatore di esprimere costantemente qualcosa, non significa che questa cosa sarà utile. Ad esempio, UML consente di avere un diagramma di attività costituito esclusivamente da un nodo iniziale con un flusso verso un nodo finale. Solo un altro modo elaborato per dire che l'attività consiste nel non fare nulla.
La possibilità di avere un solo input su un join o un output su una fork presenta alcuni vantaggi in termini di espressività, senza influenzare la semantica. Usando questo tipo di costrutto:
- È possibile evidenziare che si tratta di un diagramma parziale del modello, essendo inteso che una parte del modello di attività non è rappresentata o deve ancora essere progettata;
- Puoi anche suggerire che potrebbe essere previsto un certo grado di concorrenza tra il fork e il join in futuro.
- Puoi isolare visivamente una sequenza di azioni