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

Kva er objektorientert programmering?

Velkomen til IT 2! I dette kurset skal du lære å programmere på ein ny måte – ein måte som gjer det enklare å byggje store, komplekse program. Metoden vert kalla objektorientert programmering (OOP), og han vert brukt i dei fleste moderne programmeringsspråk.

Kanskje lurer du på: Kva tyder eigentleg "objektorientert"? Kvifor kan vi ikkje berre halde fram med å programmere som vi gjorde i IT 1? I dette kapittelet skal vi utforske kva OOP er, kvifor det finst, og korleis det skil seg frå den prosedyrelle programmeringa du er van med.

Paradigme i programmering

Eit programmeringsparadigme er ein grunnleggjande stil eller filosofi for korleis vi organiserer og strukturerer kode. Dei to viktigaste paradigma du møter er:

- Prosedyrell programmering: Koden vert organisert i funksjonar som utfører oppgåver i ei bestemt rekkjefølgje
- Objektorientert programmering (OOP): Koden vert organisert rundt objekt som representerer ting i den verkelege verda eller i programmet

Frå prosedyrar til objekt

I IT 1 programmerte du hovudsakleg prosedyrelt. Du skreiv funksjonar som gjorde ting, lagra data i variablar og lister, og kalla funksjonane når du trong dei. Dette fungerer fint for små program, men etter kvart som programma vert større, oppstår nokre utfordringar:

Problem 1: Data og funksjonar er åtskilde
Når du har mange funksjonar og variablar, er det lett å miste oversikta over kva funksjonar som jobbar med kva data.

Problem 2: Vanskeleg å gjenbruke kode
Dersom du vil ha to "spelarar" i eit spel, må du lage separate variablar for kvar (spiller1poeng, spiller2poeng, osv.).

Problem 3: Kompleksiteten veks fort
Jo fleire funksjonar du legg til, jo vanskelegare vert det å halde orden på kva som høyrer saman.

Objektorientert programmering løyser desse problema ved å samle relatert data og funksjonar i objekt.

✏️Samanlikning: Prosedyrell vs. objektorientert

Lat oss sjå på eit eksempel som illustrerer skilnaden. Vi skal lage eit enkelt program som handterer ein 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øyrer til ein bankkonto samla på éin stad. Vi kan enkelt lage fleire kontoar, og kvar konto har sine eigne data. Metodane (funksjonane) er "bundne til" objektet.

Grunnomgrep i OOP

Når vi snakkar om objektorientert programmering, møter du på nokre kjerneomgrep:

- Klasse: Ein mal eller oppskrift for å lage objekt (som ei kakeform)
- Objekt: Ein konkret instans av ein klasse (som ei ferdigbakt kake)
- Attributt: Data som høyrer til eit objekt (t.d. kontonummer, saldo)
- Metode: Ein funksjon som høyrer til eit objekt (t.d. settinn, taut)

Desse omgrepa kjem vi tilbake til i detalj i dei neste kapitla.

Historia bak OOP

Objektorientert programmering er ikkje noko nytt. Faktisk vart det fyrste OOP-språket, Simula, utvikla i Noreg på 1960-talet av Ole-Johan Dahl og Kristen Nygaard ved Norsk Regnesentral. Dei ville simulere komplekse system (difor namnet "Simula") og trong ein betre måte å organisere kode på.

På 1970- og 80-talet utvikla fleire språk OOP-konseptet vidare:
- Smalltalk (1972) – eit reint objektorientert språk
- C++ (1983) – la til OOP i C-språket
- Java (1995) – populariserte OOP for nettet

I dag støttar dei fleste moderne språk OOP: Python, JavaScript, C#, Ruby, Swift, Kotlin – lista er lang. Sjølv om ikkje alle program vert skrivne objektorientert, er det ein svært viktig ferdigheit for moderne utviklarar.

Fordelane med OOP

Kvifor har objektorientert programmering blitt så populært? Det er fleire grunnar:

1. Modularitet
Koden vert delt inn i sjølvstendige modular (klassar). Kvar klasse har eit klart ansvar, noko som gjer det lettare å forstå og vedlikehalde koden.

2. Gjenbrukbarheit
Når du har laga ein god klasse, kan du gjenbruke han i mange program. Du kan òg utvide klassar (arv) utan å endre den opphavlege koden.

3. Vedlikehaldbarheit
Dersom du oppdagar ein feil i korleis bankkonto-logikken fungerer, treng du berre å fikse det på éin stad – i Bankkonto-klassen. Alt anna fungerer framleis.

4. Abstraksjon
Du kan skjule kompleksitet. Brukaren av ein Bankkonto-klasse treng ikkje å vite korleis saldo vert lagra eller korleis renter vert rekna ut – dei kallar berre metodane.

5. Naturleg modellering
OOP gjer det lettare å modellere verkelege ting. Ein app for dyrehospital kan ha klassar som Hund, Katt, Behandling, Veterinær – det følgjer den naturlege strukturen.

✏️Gjenbruk av klassar

Lat oss seie du har laga ein Bankkonto-klasse. Seinare vil du lage ein Sparekonto som har dei same grunnfunksjonane, men òg reknar ut renter. Med OOP kan du byggje vidare på det du alt 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 arvar alle metodane frå Bankkonto (settinn, taut), men legg til ny funksjonalitet (leggtilrenter). Dette er gjenbruk i praksis!

Når bør du bruke OOP?

Objektorientert programmering er kraftig, men det er ikkje alltid det beste valet. Her er nokre retningslinjer:

Bruk OOP når:
- Programmet er stort og komplekst
- Du jobbar med data som naturleg kan grupperast (t.d. personar, produkt, køyretøy)
- Du treng å gjenbruke kode på tvers av prosjekt
- Fleire utviklarar jobbar på same prosjekt

Prosedyrell kode kan vere betre når:
- Programmet er lite og enkelt (eit par dusin linjer)
- Du skriv eit enkelt skript som vert køyrt éin gong
- Yting er kritisk og du vil unngå overhead

I IT 2 fokuserer vi på OOP fordi det er den dominerande stilen i moderne utvikling, og fordi det lærer deg å tenkje strukturert om komplekse problem.

OOP i Python

I dette kurset bruker vi Python for å lære OOP. Python støttar både prosedyrell og objektorientert programmering, noko som gjer det til eit godt undervisningsspråk.

Python-syntaksen for OOP er rein og enkel:
- Vi bruker class for å definere ein klasse
- Vi bruker __init__ som konstruktør (oppsett ved oppretting)
- Vi bruker self for å referere til objektet sjølv

Her er eit 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 dei neste kapitla skal vi dykke djupare inn i korleis klassar og objekt fungerer.

Oppsummering

I dette kapittelet har du lært:

- Programmeringsparadigme: ein grunnleggjande stil for å strukturere kode.
- Prosedyrell vs. objektorientert: funksjonar og data mot objekt.
- OOP-grunnomgrep: klasse, objekt, attributt og metode.
- Fordelar med OOP: gjenbruk, struktur og vedlikehald.
- OOP i Python: klassar og objekt.

Noekkelbegreper


BegrepForklaring
ParadigmeGrunnleggjande stil for å strukturere kode
OOPObjektorientert programmering
KlasseMal for å lage objekt
ObjektKonkret instans av ein 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.