Tilbake
2.5
UML og modellering

2.5 UML og modellering

Klassediagrammer, sekvensdiagrammer og systemmodellering.

55 min
6 oppgaver
UMLKlassediagramSekvensdiagramModellering
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 6 oppgaver

UML og modellering

Før du begynner å kode, er det lurt å planlegge. UML (Unified Modeling Language) er et standardisert visuelt språk for å tegne programvaredesign.

UML-diagrammer fungerer som "blåkopier" for kode – de hjelper deg å tenke gjennom strukturen før du skriver en eneste linje Python!

Vi skal se på tre viktige diagramtyper: klassediagrammer, use case-diagrammer og sekvensdiagrammer.

Definisjon
UML (Unified Modeling Language) er et standardisert modelleringsspråk for å visualisere, spesifisere og dokumentere programvaresystemer.

Fordeler med UML:
- Gir en felles visuell forståelse av systemet
- Hjelper med planlegging før koding
- Dokumenterer design for andre utviklere
- Gjør det lettere å diskutere løsninger

Vanlige diagramtyper:
- Klassediagram – viser klasser og relasjoner
- Use case-diagram – viser funksjonalitet fra brukerens perspektiv
- Sekvensdiagram – viser interaksjon mellom objekter over tid

✏️Eksempel

Eksempel: Klassediagram – Grunnleggende

Et klassediagram viser klasser med:
- Navn øverst
- Attributter (variabler) i midten
- Metoder nederst

Eksempel i UML:

┌─────────────────┐
│     Person      │
├─────────────────┤
│ - navn: str     │
│ - alder: int    │
├─────────────────┤
│ + __init__()    │
│ + si_hei()      │
└─────────────────┘

Symboler:
- - = privat (eller protected i Python: _)
- + = public (standard i Python)
- # = protected

Tilsvarende Python-kode:

class Person:
    def __init__(self, navn, alder):
        self.navn = navn      # + (public)
        self.alder = alder    # + (public)

    def si_hei(self):
        print(f"Hei, jeg er {self.navn}!")
Definisjon
Relasjoner i klassediagram:

1. Arv (Inheritance): Pil med hvit trekant
- Student ──▷ Person (Student arver fra Person)

2. Komposisjon (Composition): Linje med fylt diamant
- Bil ◆──── Motor (Bil "eier" Motor)

3. Aggregering (Aggregation): Linje med tom diamant
- Skole ◇──── Student (Skole "har" Studenter)

4. Assosiasjon (Association): Enkel linje
- Person ──── Adresse (Person "bruker" Adresse)

5. Avhengighet (Dependency): Stiplet pil
- Klasse A ······> Klasse B (A bruker B midlertidig)

✏️Eksempel

Eksempel: Klassediagram med relasjoner

┌─────────────────┐
│     Person      │
├─────────────────┤
│ - navn: str     │
│ - alder: int    │
├─────────────────┤
│ + si_hei()      │
└─────────────────┘
         △
         │
         │ (arv)
         │
┌─────────────────┐
│    Student      │
├─────────────────┤
│ - studieprogram │
├─────────────────┤
│ + studer()      │
└─────────────────┘

┌─────────────────┐        ┌─────────────────┐
│      Bil        │        │     Motor       │
├─────────────────┤        ├─────────────────┤
│ - merke: str    │ ◆────  │ - hk: int       │
├─────────────────┤        ├─────────────────┤
│ + start()       │        │ + start()       │
└─────────────────┘        └─────────────────┘
  (komposisjon)

Tilsvarende Python:

class Person:
    def __init__(self, navn, alder):
        self.navn = navn
        self.alder = alder

    def si_hei(self):
        print(f"Hei, jeg er {self.navn}!")

class Student(Person):  # Arv
    def __init__(self, navn, alder, studieprogram):
        super().__init__(navn, alder)
        self.studieprogram = studieprogram

    def studer(self):
        print(f"Studerer {self.studieprogram}")

class Motor:
    def __init__(self, hk):
        self.hk = hk

    def start(self):
        print(f"Motor med {self.hk} hk startet")

class Bil:
    def __init__(self, merke, hk):
        self.merke = merke
        self.motor = Motor(hk)  # Komposisjon

    def start(self):
        self.motor.start()
✏️Eksempel

Eksempel: Use case-diagram

Use case-diagrammer viser funksjonalitet fra brukerens perspektiv.

Eksempel: Nettbank-system

        Kunde
          │
          │ (bruker)
          ▼
    ┌───────────────┐
    │ Logg inn      │
    └───────────────┘
          │
    ┌───────────────┐
    │ Se saldo      │
    └───────────────┘
          │
    ┌───────────────┐
    │ Overfør penger│
    └───────────────┘

Komponenter:
- Aktør (strekfigur): Kunde
- Use cases (ovaler): Logg inn, Se saldo, Overfør penger
- Forbindelser (linjer): Viser hvem som bruker hva

Use cases beskriver hva systemet gjør, ikke hvordan.

Definisjon
Sekvensdiagram viser hvordan objekter samhandler over tid.

Komponenter:
- Objekter øverst (bokser)
- Livslinjer (vertikale stiplete linjer)
- Meldinger (horisontale piler mellom livslinjer)
- Aktivering (tynne bokser på livslinjen)

Sekvensdiagrammer er nyttige for å forstå komplekse interaksjoner og flyten i programmer.

✏️Eksempel

Eksempel: Sekvensdiagram – Handlekurv

Bruker      Handlekurv    Vare
  │             │           │
  │ legg_til()  │           │
  ├────────────>│           │
  │             │ get_pris()│
  │             ├──────────>│
  │             │<──────────┤
  │             │  199 kr   │
  │             │           │
  │   betal()   │           │
  ├────────────>│           │
  │             │ sum()     │
  │             ├──────┐    │
  │             │<─────┘    │
  │<────────────┤           │
  │  "Betalt"   │           │

Tolkning:
1. Bruker kaller legg_til() på Handlekurv
2. Handlekurv spør Vare om pris
3. Vare returnerer 199 kr
4. Bruker kaller betal()
5. Handlekurv beregner sum (intern)
6. Handlekurv returnerer "Betalt" til Bruker

Sekvensdiagrammer viser rekkefølgen av operasjoner.

✏️Eksempel

Eksempel: Praktisk bruk – Planlegging med UML

La oss planlegge et enkelt biblioteksystem:

1. Use case-diagram (funksjonalitet):

Bibliotekar
    │
    ├── Registrer bok
    ├── Lån ut bok
    └── Ta imot retur

Medlem
    │
    ├── Søk etter bok
    └── Reserver bok

2. Klassediagram (struktur):

┌─────────────────┐        ┌─────────────────┐
│     Bok         │        │    Medlem       │
├─────────────────┤        ├─────────────────┤
│ - tittel: str   │        │ - navn: str     │
│ - forfatter     │        │ - medlemsnr     │
│ - isbn          │        ├─────────────────┤
├─────────────────┤        │ + lån_bok()     │
│ + __str__()     │ ◇─────  │ + lever_bok()   │
└─────────────────┘        └─────────────────┘
  (aggregering – medlem kan ha bøker)

3. Sekvensdiagram (utlånsprosess):

Bibliotekar   System    Medlem    Bok
     │           │         │        │
     │ lån_ut()  │         │        │
     ├──────────>│         │        │
     │           │ sjekk_  │        │
     │           ├────────>│        │
     │           │<────────┤        │
     │           │   OK    │        │
     │           │ marker_ │        │
     │           │ utlånt()│        │
     │           ├────────────────>│
     │<──────────┤         │        │
     │ "Suksess" │         │        │

Ved å planlegge med UML unngår du mange feil før du koder!

Oppsummering

I dette kapittelet har du lært:

- UML er et standardisert visuelt språk for programvaredesign
- Klassediagrammer viser klasser, attributter, metoder og relasjoner
- Use case-diagrammer viser funksjonalitet fra brukerens perspektiv
- Sekvensdiagrammer viser interaksjon mellom objekter over tid
- UML hjelper med planlegging, dokumentasjon og kommunikasjon

Med UML kan du tenke gjennom design før du skriver kode – og kommunisere løsninger visuelt!

Du har nå fullført Seksjon 2: Avansert OOP og designmønstre!

Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.