Introduksjon til OOP-paradigmet og dets prinsipper.
Hva er objektorientert programmering?
Velkommen til IT 2! I dette kurset skal du lære å programmere på en ny måte – en måte som gjør det enklere å bygge store, komplekse programmer. Metoden kalles objektorientert programmering (OOP), og den brukes i de fleste moderne programmeringsspråk.
Kanskje lurer du på: Hva betyr egentlig "objektorientert"? Hvorfor kan vi ikke bare fortsette å programmere som vi gjorde i IT 1? I dette kapittelet skal vi utforske hva OOP er, hvorfor det finnes, og hvordan det skiller seg fra den prosedyrelle programmeringen du er vant til.
Et programmeringsparadigme er en grunnleggende stil eller filosofi for hvordan vi organiserer og strukturerer kode. De to viktigste paradigmene du møter er:
- Prosedyrell programmering: Koden organiseres i funksjoner som utfører oppgaver i en bestemt rekkefølge
- Objektorientert programmering (OOP): Koden organiseres rundt objekter som representerer ting i den virkelige verden eller i programmet
Fra prosedyrer til objekter
I IT 1 programmerte du hovedsakelig prosedyrelt. Du skrev funksjoner som gjorde ting, lagret data i variabler og lister, og kalte funksjonene når du trengte dem. Dette fungerer fint for små programmer, men etter hvert som programmene blir større, oppstår noen utfordringer:
Problem 1: Data og funksjoner er atskilt
Når du har mange funksjoner og variabler, er det lett å miste oversikten over hvilke funksjoner som jobber med hvilke data.
Problem 2: Vanskelig å gjenbruke kode
Hvis du vil ha to "spillere" i et spill, må du lage separate variabler for hver (spiller1poeng, spiller2poeng, osv.).
Problem 3: Kompleksiteten vokser fort
Jo flere funksjoner du legger til, jo vanskeligere blir det å holde orden på hva som hører sammen.
Objektorientert programmering løser disse problemene ved å samle relatert data og funksjoner i objekter.
La oss se på et eksempel som illustrerer forskjellen. Vi skal lage et enkelt program som håndterer en bankkonto.
Prosedyrell tilnærming:
# Data lagres i variabler
kontonummer = "12345678"
saldo = 1000
eier = "Kari Nordmann"
# Funksjoner jobber med dataene
def sett_inn(belop):
global saldo
saldo += belop
def ta_ut(belop):
global saldo
if belop <= saldo:
saldo -= belop
return True
return False
def vis_saldo():
print(f"Saldo for konto {kontonummer}: {saldo} kr")
# Bruk
sett_inn(500)
ta_ut(200)
vis_saldo()Objektorientert tilnærming:
class Bankkonto:
def __init__(self, kontonummer, eier, startsaldo=0):
self.kontonummer = kontonummer
self.saldo = startsaldo
self.eier = eier
def sett_inn(self, belop):
self.saldo += belop
def ta_ut(self, belop):
if belop <= self.saldo:
self.saldo -= belop
return True
return False
def vis_saldo(self):
print(f"Saldo for konto {self.kontonummer}: {self.saldo} kr")
# Bruk
konto = Bankkonto("12345678", "Kari Nordmann", 1000)
konto.sett_inn(500)
konto.ta_ut(200)
konto.vis_saldo()Fordelen? I den objektorienterte versjonen er alt som hører til en bankkonto samlet på ett sted. Vi kan enkelt lage flere kontoer, og hver konto har sine egne data. Metodene (funksjonene) er "bundet til" objektet.
Når vi snakker om objektorientert programmering, møter du på noen kjernebegreper:
- Klasse: En mal eller oppskrift for å lage objekter (som en kakeform)
- Objekt: En konkret instans av en klasse (som en ferdigbakt kake)
- Attributt: Data som tilhører et objekt (f.eks. kontonummer, saldo)
- Metode: En funksjon som tilhører et objekt (f.eks. settinn, taut)
Disse begrepene kommer vi tilbake til i detalj i de neste kapitlene.
Historien bak OOP
Objektorientert programmering er ikke noe nytt. Faktisk ble det første OOP-språket, Simula, utviklet i Norge på 1960-tallet av Ole-Johan Dahl og Kristen Nygaard ved Norsk Regnesentral. De ville simulere komplekse systemer (derav navnet "Simula") og trengte en bedre måte å organisere kode på.
På 1970- og 80-tallet utviklet flere språk OOP-konseptet videre:
- Smalltalk (1972) – et rent objektorientert språk
- C++ (1983) – la til OOP i C-språket
- Java (1995) – populariserte OOP for nettet
I dag støtter de fleste moderne språk OOP: Python, JavaScript, C#, Ruby, Swift, Kotlin – listen er lang. Selv om ikke alle programmer skrives objektorientert, er det en svært viktig ferdighet for moderne utviklere.
Fordelene med OOP
Hvorfor har objektorientert programmering blitt så populært? Det er flere grunner:
1. Modularitet
Koden deles inn i selvstendige moduler (klasser). Hver klasse har et klart ansvar, noe som gjør det lettere å forstå og vedlikeholde koden.
2. Gjenbrukbarhet
Når du har laget en god klasse, kan du gjenbruke den i mange programmer. Du kan også utvide klasser (arv) uten å endre den opprinnelige koden.
3. Vedlikeholdbarhet
Hvis du oppdager en feil i hvordan bankkonto-logikken fungerer, trenger du bare å fikse det på ett sted – i Bankkonto-klassen. Alt annet fungerer fortsatt.
4. Abstraksjon
Du kan skjule kompleksitet. Brukeren av en Bankkonto-klasse trenger ikke å vite hvordan saldo lagres eller hvordan renter beregnes – de kaller bare metodene.
5. Naturlig modellering
OOP gjør det lettere å modellere virkelige ting. En app for dyrehospital kan ha klasser som Hund, Katt, Behandling, Veterinær – det følger den naturlige strukturen.
La oss si du har laget en Bankkonto-klasse. Senere vil du lage en Sparekonto som har de samme grunnfunksjonene, men også beregner renter. Med OOP kan du bygge videre på det du allerede har:
# Original klasse
class Bankkonto:
def __init__(self, kontonummer, eier, startsaldo=0):
self.kontonummer = kontonummer
self.saldo = startsaldo
self.eier = eier
def sett_inn(self, belop):
self.saldo += belop
def ta_ut(self, belop):
if belop <= self.saldo:
self.saldo -= belop
return True
return False
# Utvidet klasse som arver fra Bankkonto
class Sparekonto(Bankkonto):
def __init__(self, kontonummer, eier, startsaldo=0, rentesats=0.02):
super().__init__(kontonummer, eier, startsaldo)
self.rentesats = rentesats
def legg_til_renter(self):
renter = self.saldo * self.rentesats
self.sett_inn(renter)
print(f"La til {renter:.2f} kr i renter")
# Bruk
sparekonto = Sparekonto("87654321", "Ola Nordmann", 5000, 0.03)
sparekonto.legg_til_renter() # La til 150.00 kr i renterLegg merke til at Sparekonto arver alle metodene fra Bankkonto (settinn, taut), men legger til ny funksjonalitet (leggtilrenter). Dette er gjenbruk i praksis!
Når bør du bruke OOP?
Objektorientert programmering er kraftig, men det er ikke alltid det beste valget. Her er noen retningslinjer:
Bruk OOP når:
- Programmet er stort og komplekst
- Du jobber med data som naturlig kan grupperes (f.eks. personer, produkter, kjøretøy)
- Du trenger å gjenbruke kode på tvers av prosjekter
- Flere utviklere jobber på samme prosjekt
Prosedyrell kode kan være bedre når:
- Programmet er lite og enkelt (et par dusin linjer)
- Du skriver et enkelt skript som kjøres én gang
- Ytelse er kritisk og du vil unngå overhead
I IT 2 fokuserer vi på OOP fordi det er den dominerende stilen i moderne utvikling, og fordi det lærer deg å tenke strukturert om komplekse problemer.
OOP i Python
I dette kurset bruker vi Python for å lære OOP. Python støtter både prosedyrell og objektorientert programmering, noe som gjør det til et godt undervisningsspråk.
Python-syntaksen for OOP er ren og enkel:
- Vi bruker class for å definere en klasse
- Vi bruker __init__ som konstruktør (oppsett ved opprettelse)
- Vi bruker self for å referere til objektet selv
Her er et minimalt eksempel:
class Hund:
def __init__(self, navn):
self.navn = navn
def bjeff(self):
print(f"{self.navn} sier: Voff!")
# Lag et objekt
min_hund = Hund("Fido")
min_hund.bjeff() # Fido sier: Voff!I de neste kapitlene skal vi dykke dypere inn i hvordan klasser og objekter fungerer.
Oppsummering
I dette kapittelet har du lært:
- Programmeringsparadigme: en grunnleggende stil for å strukturere kode.
- Prosedyrell vs. objektorientert: funksjoner og data mot objekter.
- OOP-grunnbegreper: klasse, objekt, attributt og metode.
- Fordeler med OOP: gjenbruk, struktur og vedlikehold.
- OOP i Python: klasser og objekter.
Noekkelbegreper
| Begrep | Forklaring |
|---|---|
| Paradigme | Grunnleggende stil for å strukturere kode |
| OOP | Objektorientert programmering |
| Klasse | Mal for å lage objekter |
| Objekt | Konkret instans av en klasse |
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.