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.WhenAlli 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ödesschema | Aktivitetsdiagram (UML) | |
|---|---|---|
| Standard | Löst definierat, många varianter | Del av UML, med bestämda symboler |
| Start och slut | Rundad ruta med “Start”/“Slut” | Fylld prick (start) och “tjuröga” (slut) |
| Parallellitet | Kan inte visas — ett steg i taget | Förgrening och synkronisering (tjocka staplar) |
| Vem gör vad | Syns inte | Simbanor delar upp flödet per roll eller system |
| In- och utdata | Egen symbol (parallellogram) | Används sällan — fokus ligger på handlingarna |
| Passar för | En algoritm, en enskild metod | En 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
| Del | Hur den ritas | Vad den betyder |
|---|---|---|
| Startnod (initial node) | Fylld prick | Här börjar flödet. Ett diagram har oftast exakt en |
| Aktivitet / handling (action) | Ruta med mycket rundade hörn | Ett steg som utförs — skriv det som ett verb: “Ta emot order” |
| Kontrollflöde (control flow) | Pil | Ordningen: när ett steg är klart går flödet vidare längs pilen |
| Beslutsnod (decision) | Romb med en pil in och flera ut | Här väljs en av vägarna, beroende på villkoren |
| Villkor (guard) | Text inom [hakparenteser] vid en pil | Må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 ut | Vä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 ut | Flödet delar sig i spår som körs samtidigt |
| Synkronisering (join) | Tjock stapel med flera pilar in och en ut | Vä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äng | Visar 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.
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å arbetet | Det är en enkel algoritm i en metod → flödesschema |
| Något sker parallellt och ska vänta in varandra | Det viktiga är ordningen på anropen mellan objekt → sekvensdiagram |
| Du beskriver en process för någon som inte kodar | Det är ett objekt som byter läge → tillståndsdiagram |
| Du vill visa var ansvaret lämnas över | Du 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
| Begrepp | Vad det är |
|---|---|
| Aktivitetsdiagram | Ett arbetsflöde steg för steg — med beslut, parallella spår och ansvar |
| Romb | Beslut eller sammanslagning: en väg i taget |
| Tjock stapel | Förgrening eller synkronisering: alla vägar, samtidigt |
| Simbana | Visar vem som gör vad |
Task.WhenAll | C#:s sätt att skriva en join |