Tilbake
1.1
Hva er objektorientert programmering?

1.1 Hva er objektorientert programmering?

Introduksjon til OOP-paradigmet og dets prinsipper.

60 min
6 oppgaver
OOPParadigmerPrinsipper
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 6 oppgaver

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.

Paradigmer i programmering

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.

✏️Sammenligning: Prosedyrell vs. objektorientert

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.

Grunnbegreper i OOP

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.

✏️Gjenbruk av klasser

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 renter

Legg 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


BegrepForklaring
ParadigmeGrunnleggende stil for å strukturere kode
OOPObjektorientert programmering
KlasseMal for å lage objekter
ObjektKonkret 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.