Klassediagrammer, sekvensdiagrammer og systemmodellering.
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.
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: 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}!")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: 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: 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.
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: 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: 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 bok2. 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.