Sekvensdiagram

Ett sekvensdiagram visar vem som pratar med vem, i vilken ordning. Tiden går uppifrån och ner, och varje pil är ett anrop eller ett svar. Där klassdiagrammet visar hur koden ser ut, visar sekvensdiagrammet hur den beter sig när något händer.

När du läst detta ska du kunna

  • Känna igen och namnge delarna i ett sekvensdiagram
  • Skilja på anrop och svar
  • Rita ett flöde där ett villkor styr vad som händer (alt)
  • Översätta ett sekvensdiagram till metodanrop i C#

Vad används det till?

  • Förstå befintlig kod — vem anropar vem när användaren klickar “Köp”?
  • Planera ett nytt flöde innan du kodar — inloggning, betalning, API-anrop
  • Förklara för andra — i en kodgranskning eller dokumentation av ett API
  • Hitta problem — onödigt många anrop, eller ett objekt som gör för mycket

Delarna och vad de heter

Sekvensdiagram med namngivna delar: deltagare, livslinje, aktiveringsstapel, synkront anrop, svar, självanrop, kombinerat fragment och villkor Kund Kassa Lager 1: köp(vara) 2: finnsILager(vara) true 3: beräknaPris() alt [betalning godkänd] kvitto Deltagare Livslinje Synkront anrop Aktiveringsstapel Svar (retur) Självanrop Kombinerat fragment Villkor (guard)
DelHur den ritasVad den betyder
Deltagare (participant)Ruta högst uppEtt objekt, en klass, en tjänst eller en person som deltar
Livslinje (lifeline)Streckad lodrät linjeDeltagarens “tidslinje” — tiden går nedåt
AktiveringsstapelSmal stapel på livslinjenDeltagaren håller på att utföra något just nu
Synkront anropHeldragen pil, fylld spets“Gör det här — jag väntar på svaret” (ett vanligt metodanrop)
Asynkront anropHeldragen pil, öppen spets“Gör det här — jag väntar inte” (t.ex. ett meddelande på en kö)
Svar (return)Streckad pil, öppen spetsReturvärdet som skickas tillbaka
SjälvanropPil som går ut och tillbaka till samma livslinjeObjektet anropar en egen metod
Kombinerat fragmentRam med etikett i hörnetEn del av flödet med särskild regel: alt (om/annars), opt (kanske), loop (upprepas)
Villkor (guard)Text inom [hakparenteser]Villkoret som måste vara sant för att fragmentet ska köras

Siffrorna framför anropen (1:, 2:, 3:) är frivilliga, men gör det lättare att prata om diagrammet: “i steg 2 frågar kassan lagret…”.

Exempel — inloggning

En användare loggar in. LoginController frågar AuthService, som hämtar användaren från databasen. Stämmer lösenordet får användaren en token — annars ett felmeddelande. Ramen alt med en streckad skiljelinje är sekvensdiagrammets if/else.

Sekvensdiagram för inloggning: Användare, LoginController, AuthService och Databas, med alt-fragment för rätt och fel lösenord Användare LoginController AuthService Databas logIn(namn, lösen) validera(namn, lösen) hämtaAnvändare(namn) användare jämförHash() alt [lösenord stämmer] token [annars] null resultat

Samma flöde i C# — varje heldragen pil blir ett metodanrop, varje streckad pil ett return:

public class LoginController
{
private readonly AuthService _auth;
public LoginController(AuthService auth) => _auth = auth;
public string LogIn(string name, string password)
{
string? token = _auth.Validate(name, password); // validera(namn, lösen)
return token ?? "Fel användarnamn eller lösenord"; // resultat
}
}
public class AuthService
{
private readonly UserDatabase _db;
public AuthService(UserDatabase db) => _db = db;
public string? Validate(string name, string password)
{
User? user = _db.GetUser(name); // hämtaAnvändare(namn)
if (user != null && CompareHash(user, password)) // jämförHash() + alt
{
return CreateToken(user); // [lösenord stämmer] → token
}
return null; // [annars] → null
}
private bool CompareHash(User user, string password) { /* ... */ return true; }
private string CreateToken(User user) { /* ... */ return "abc123"; }
}

När ska du välja ett sekvensdiagram?

Välj sekvensdiagram när…Välj något annat när…
Ordningen mellan anrop är det viktigaDu vill visa vilka klasser som finns → klassdiagram
Flera objekt eller tjänster samarbetarDet är ett objekts logik med många beslut → flödesschema
Du dokumenterar ett API-anrop eller en integrationDu vill visa vilka lägen något kan vara i → tillståndsdiagram

Vanliga misstag

  • För många deltagare. Fler än 5–6 livslinjer blir oläsligt. Rita ett diagram per scenario istället.
  • Glömda svar. Det är lätt att rita anropen men hoppa över returpilarna — då syns inte vad som skickas tillbaka.
  • Varje rad kod som en pil. Rita de anrop som är intressanta för den som läser, inte varje ToString().

Övning

Rita ett sekvensdiagram för när en kund tar ut pengar i en bankomat: Kund, Bankomat, Bank. Kunden sätter in kortet och anger PIN, bankomaten frågar banken om PIN stämmer och om det finns täckning. Använd ett alt-fragment för “täckning finns” / “annars”.

TL;DR

BegreppVad det är
SekvensdiagramVem pratar med vem, i vilken ordning — tiden går nedåt
Heldragen pilAnrop
Streckad pilSvar
alt / opt / loopOm/annars, kanske, upprepning