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 lesevennlige versjonen
Din fremgang i kapitlet
0 / 6 oppgaver

Velkommen til en ny måte å tenke på

Tenk deg at du skal bygge et bibliotek-system. Det skal holde styr på tusenvis av bøker, hundrevis av lånere, alle utlån og reservasjoner – og fem ansatte skal bruke det samtidig. I IT 1 lærte du å programmere prosedyrelt: du skrev funksjoner som gjorde ting, lagret data i variabler og lister, og kalte funksjonene når du trengte dem. Det fungerer utmerket for små programmer. Men forsøk å bygge biblioteket på den måten, og du drukner raskt i et hav av variabler.

Det er her objektorientert programmering kommer inn – ofte forkortet OOP. Det er en grunnleggende annen måte å organisere kode på, og den brukes i de aller fleste moderne programmeringsspråk. I dette kapittelet skal vi finne ut hva OOP egentlig er, hvorfor det ble oppfunnet, og hvordan det skiller seg fra programmeringen du allerede kjenner.

For å forstå OOP må vi først snakke om paradigmer. Et programmeringsparadigme er en grunnleggende stil eller filosofi for hvordan vi strukturerer kode. De to viktigste du møter, er nettopp prosedyrell og objektorientert programmering. I prosedyrell programmering organiseres koden i funksjoner som utfører oppgaver i en bestemt rekkefølge. I OOP organiseres koden rundt objekter som representerer ting i den virkelige verden eller i programmet.

Hvorfor prosedyrell kode bryter sammen

La oss se hva som faktisk går galt når prosedyrelle programmer vokser. Det dukker opp tre tilbakevendende problemer.

For det første blir data og funksjoner atskilt. Når du har mange funksjoner og mange variabler, er det lett å miste oversikten over hvilke funksjoner som hører til hvilke data. For det andre blir det vanskelig å gjenbruke kode. Vil du ha to spillere i et spill, må du lage separate variabler for hver: spiller1_poeng, spiller2_poeng og så videre. For det tredje vokser kompleksiteten fort – jo flere funksjoner du legger til, jo vanskeligere blir det å holde orden på hva som hører sammen.

OOP løser dette ved å samle relatert data og funksjoner i objekter. La oss sammenligne med et konkret eksempel: en bankkonto. Prosedyrelt ville du hatt løse variabler for kontonummer, saldo og eier, og frittstående funksjoner som sett_inn, ta_ut og vis_saldo som jobber på en global saldo. Objektorientert samler vi alt i en 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

konto = Bankkonto("12345678", "Kari Nordmann", 1000)
konto.sett_inn(500)
konto.ta_ut(200)

Nå 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 er bundet til objektet.

📝Oppgave Quiz 1

En norsk oppfinnelse og fem fordeler

Kanskje tror du OOP er noe nymotens. Sannheten er det stikk motsatte – og den har en norsk stolthet i seg. Det første objektorienterte språket, Simula, ble utviklet i Norge på 1960-tallet av Ole-Johan Dahl og Kristen Nygaard ved Norsk Regnesentral. De ville simulere komplekse systemer, derav navnet, og trengte en bedre måte å organisere kode på. Senere bygde andre videre: Smalltalk kom i 1972 som et rent objektorientert språk, C++ la til OOP i C-språket i 1983, og Java populariserte OOP for nettet i 1995. I dag støtter nesten alle moderne språk OOP – Python, JavaScript, C#, Ruby, Swift, Kotlin.

Hvorfor ble OOP så populært? Fem grunner peker seg ut. Modularitet: koden deles inn i selvstendige klasser med klart ansvar. Gjenbrukbarhet: en god klasse kan brukes i mange programmer, og du kan utvide den med arv uten å endre originalen. Vedlikeholdbarhet: oppdager du en feil i bankkonto-logikken, fikser du det ett sted. Abstraksjon: du kan skjule kompleksitet, slik at brukeren bare kaller metodene uten å vite hvordan ting lagres. Naturlig modellering: et dyrehospital-system kan ha klasser som Hund, Katt, Behandling og Veterinær, akkurat som virkeligheten.

Arv er gjenbruk i praksis. En Sparekonto kan arve alt fra Bankkonto og bare legge til renteberegning:

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)

Én ting er verdt å merke seg: OOP gir ikke nødvendigvis raskere kjøretid. Fordelen ligger i struktur, gjenbruk og vedlikehold – ikke i hastighet.

📝Oppgave Quiz 2

Grunnbegrepene og når du bør velge OOP

Før vi går videre, trenger du fire ord i ryggmargen. En klasse er en mal eller oppskrift for å lage objekter – tenk på en kakeform. Et objekt er en konkret instans av klassen – den ferdigbakte kaken. Et attributt er data som tilhører objektet, som kontonummer eller saldo. En metode er en funksjon som tilhører objektet, som sett_inn eller ta_ut. I Python definerer vi en klasse med class, setter opp objektet i konstruktøren __init__, og bruker self for å referere til objektet selv:

class Hund:
    def __init__(self, navn):
        self.navn = navn

    def bjeff(self):
        print(f"{self.navn} sier: Voff!")

min_hund = Hund("Fido")
min_hund.bjeff()  # Fido sier: Voff!

Men OOP er ikke alltid riktig valg. Bruk det når programmet er stort og komplekst, når data naturlig kan grupperes som personer, produkter eller kjøretøy, når du vil gjenbruke kode på tvers av prosjekter, eller når flere utviklere jobber sammen. Prosedyrell kode kan derimot være bedre når programmet er lite, når du skriver et engangsskript, eller når ytelse er kritisk. Skal du for eksempel konvertere én temperatur fra Celsius til Fahrenheit, er en enkel funksjon mest hensiktsmessig – en hel Temperatur-klasse ville vært å skyte spurv med kanon. I IT 2 fokuserer vi likevel på OOP, fordi det er den dominerende stilen i moderne utvikling og lærer deg å tenke strukturert om komplekse problemer.

📝Oppgave Quiz 3

Oppsummering

Vi startet med et bibliotek-system som ble for stort for løse variabler, og endte med en helt ny måte å tenke kode på. Et paradigme er en grunnleggende stil for å strukturere kode, og de to viktigste er prosedyrell programmering, der koden organiseres i funksjoner, og objektorientert programmering, der koden organiseres rundt objekter. OOP løser problemene med atskilte data, vanskelig gjenbruk og voksende kompleksitet ved å samle data og metoder i klasser.

Fire begreper er fundamentet: klasse (malen), objekt (instansen), attributt (dataene) og metode (funksjonen). Vi så at OOP har en norsk opprinnelse i Simula fra 1960-tallet, og at fordelene er modularitet, gjenbrukbarhet, vedlikeholdbarhet, abstraksjon og naturlig modellering – men ikke nødvendigvis raskere kjøretid. OOP egner seg best for store, komplekse systemer med mange sammenhengende entiteter, mens enkle engangsoppgaver fortsatt løses best prosedyrelt. I neste kapittel dykker vi dypere inn i hvordan klasser og objekter faktisk fungerer.

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.