Aktivitetsdiagram

Ett aktivitetsdiagram visar hur ett arbetsflöde går, steg för steg. Det liknar ett flödesschema, men kan två saker till: visa att flera saker händer samtidigt (förgrening och synkronisering), och visa vem som gör vad (simbanor). Därför passar det lika bra för en affärsprocess med flera inblandade som för en metod med parallella anrop.

När du läst detta ska du kunna

  • Känna igen och namnge delarna i ett aktivitetsdiagram
  • Förklara skillnaden mellan ett aktivitetsdiagram och ett vanligt flödesschema
  • Rita ett flöde med beslut, simbanor och parallella spår
  • Översätta förgrening och synkronisering till Task.WhenAll i C#

Vad används det till?

  • Beskriva en process där flera roller eller system är inblandade — en order, en ansökan, en returhantering
  • Visa vad som kan ske parallellt — betalning och plockning behöver inte vänta på varandra
  • Planera logiken i en metod eller ett API-flöde innan du kodar
  • Prata med verksamheten — en kund eller produktägare kan läsa ett aktivitetsdiagram utan att kunna programmera

Skillnaden mot ett flödesschema

Ett flödesschema och ett aktivitetsdiagram ser nästan likadana ut: rutor, pilar och romber. Skillnaden är vad de kan uttrycka:

FlödesschemaAktivitetsdiagram (UML)
StandardLöst definierat, många varianterDel av UML, med bestämda symboler
Start och slutRundad ruta med “Start”/“Slut”Fylld prick (start) och “tjuröga” (slut)
ParallellitetKan inte visas — ett steg i tagetFörgrening och synkronisering (tjocka staplar)
Vem gör vadSyns inteSimbanor delar upp flödet per roll eller system
In- och utdataEgen symbol (parallellogram)Används sällan — fokus ligger på handlingarna
Passar förEn algoritm, en enskild metodEn process med flera aktörer eller parallella spår

Tumregel: är det en sak som tänker igenom ett problem i tur och ordning — rita ett flödesschema. Är det flera som samarbetar, eller saker som sker samtidigt — rita ett aktivitetsdiagram.

Delarna och vad de heter

Aktivitetsdiagram med namngivna delar: simbana, startnod, aktivitet, beslutsnod, villkor, sammanslagningsnod, förgrening, synkronisering, kontrollflöde och slutnod System Ta emot order [i lager] [slut] Reservera Beställ hem Ta betalt Plocka varor Simbana (partition) Startnod Aktivitet (handling) Beslutsnod Villkor [guard] Sammanslagning (merge) Förgrening (fork) Synkronisering (join) Kontrollflöde Slutnod
DelHur den ritasVad den betyder
Startnod (initial node)Fylld prickHär börjar flödet. Ett diagram har oftast exakt en
Aktivitet / handling (action)Ruta med mycket rundade hörnEtt steg som utförs — skriv det som ett verb: “Ta emot order”
Kontrollflöde (control flow)PilOrdningen: när ett steg är klart går flödet vidare längs pilen
Beslutsnod (decision)Romb med en pil in och flera utHär väljs en av vägarna, beroende på villkoren
Villkor (guard)Text inom [hakparenteser] vid en pilMåste vara sant för att flödet ska ta just den vägen. Villkoren ska täcka alla fall och inte överlappa
Sammanslagningsnod (merge)Romb med flera pilar in och en utVägarna från ett beslut möts igen. Inget väntar — den som kommer först går vidare
Förgrening (fork)Tjock stapel med en pil in och flera utFlödet delar sig i spår som körs samtidigt
Synkronisering (join)Tjock stapel med flera pilar in och en utVäntar tills alla inkommande spår är klara, sedan går flödet vidare
Simbana (swimlane, partition)Fält med rubrik, som en bana i en simbassängVisar vem som utför stegen i fältet — en roll, en avdelning eller ett system
Slutnod (activity final)Prick med en ring runt (“tjuröga”)Här tar hela aktiviteten slut

Lägg särskilt märke till skillnaden mellan romben och stapeln. Romben betyder “antingen eller” — bara en väg tas. Stapeln betyder “både och” — alla vägar tas, samtidigt.

Exempel — en order i en webbshop

En kund lägger en order. Systemet kontrollerar lagret. Finns varorna inte får kunden besked och flödet slutar där. Finns de, delar sig flödet: systemet tar betalt samtidigt som lagret plockar varorna. När båda är klara skickas en bekräftelse till kunden. De tre simbanorna visar direkt vem som ansvarar för vilket steg.

Aktivitetsdiagram för en webbshopsorder med simbanorna Kund, System och Lager, där betalning och plockning sker parallellt mellan en förgrening och en synkronisering Kund System Lager Lägg order Kontrollera lager [slut] Får besked: slut [i lager] Ta betalt Plocka varor Skicka bekräftelse Får bekräftelse

Lägg märke till att en pil gärna får korsa en simbana — det är just där ansvaret lämnas över (“Lägg order” hos kunden → “Kontrollera lager” i systemet). Och diagrammet har två slutnoder: ett flöde kan sluta på flera ställen.

Från förgrening till Task.WhenAll

Förgreningen och synkroniseringen har en direkt motsvarighet i C#. Starta båda uppgifterna utan att vänta på dem (förgreningen), och vänta sedan in båda med Task.WhenAll (synkroniseringen):

public class OrderService
{
private readonly IStock _stock;
private readonly IPayment _payment;
private readonly IWarehouse _warehouse;
private readonly IMailer _mailer;
public OrderService(IStock stock, IPayment payment, IWarehouse warehouse, IMailer mailer)
{
_stock = stock;
_payment = payment;
_warehouse = warehouse;
_mailer = mailer;
}
public async Task<bool> HandleOrderAsync(Order order)
{
if (!await _stock.IsInStockAsync(order)) // beslutsnod
{
await _mailer.SendOutOfStockAsync(order); // [slut] → Får besked: slut
return false; // slutnod
}
Task payment = _payment.ChargeAsync(order); // förgrening: starta båda...
Task picking = _warehouse.PickAsync(order); // ...utan att vänta
await Task.WhenAll(payment, picking); // synkronisering: vänta på alla
await _mailer.SendConfirmationAsync(order); // Skicka bekräftelse
return true;
}
}

Hade du skrivit await _payment.ChargeAsync(order); följt av await _warehouse.PickAsync(order); hade koden blivit ett flödesschema — ett steg i taget. Med Task.WhenAll blir den aktivitetsdiagrammet. Mer om Task.WhenAll finns i Trådar och TPL.

När ska du välja ett aktivitetsdiagram?

Välj aktivitetsdiagram när…Välj något annat när…
Flera roller eller system delar på arbetetDet är en enkel algoritm i en metod → flödesschema
Något sker parallellt och ska vänta in varandraDet viktiga är ordningen på anropen mellan objekt → sekvensdiagram
Du beskriver en process för någon som inte kodarDet är ett objekt som byter läge → tillståndsdiagram
Du vill visa var ansvaret lämnas överDu vill visa vad systemet ska kunna, inte hur → användningsfallsdiagram

Vanliga misstag

  • Romb istället för stapel. En beslutsnod väljer en väg. Vill du att två saker händer samtidigt behövs en förgrening (stapel).
  • Förgrening utan synkronisering. Om spåren aldrig möts i en join är det oklart när nästa steg får börja.
  • Villkor som inte täcker alla fall. [belopp > 100] och [belopp < 100] — vad händer när beloppet är exakt 100?
  • Substantiv i rutorna. “Betalning” säger inte vad som görs. Skriv “Ta betalt”.
  • Allt i ett diagram. Ett aktivitetsdiagram per process. Blir det större än en skärm — dela upp det.

Övning

Rita ett aktivitetsdiagram för en returhantering i webbshoppen med simbanorna Kund, Kundtjänst och Lager. Kunden anmäler en retur, kundtjänst godkänner eller nekar ([godkänd] / [nekad]). Vid godkänd retur ska lagret ta emot varan samtidigt som kundtjänst betalar tillbaka pengarna — använd en förgrening och en synkronisering. Skriv sedan metoden i C# med Task.WhenAll.

TL;DR

BegreppVad det är
AktivitetsdiagramEtt arbetsflöde steg för steg — med beslut, parallella spår och ansvar
RombBeslut eller sammanslagning: en väg i taget
Tjock stapelFörgrening eller synkronisering: alla vägar, samtidigt
SimbanaVisar vem som gör vad
Task.WhenAllC#:s sätt att skriva en join