1 / 20

Objektorientert Programmering

Introduksjon & Motivasjon

Hvorfor er objektorientert programmering så viktig i moderne programvareutvikling?

Læringsmål for denne økta

Etter denne økta skal du kunne:

💭 Spørsmål: Hvilke programmeringsspråk kjenner du som støtter OOP?
Eksempler: Java, C++, Python, C#, JavaScript, Ruby, og mange flere!

Historisk perspektiv

Objektorientert programmering ble utviklet for å løse kompleksitetsproblemet i store programmer:

1960-70
Prosedyrell
programmering
1980-90
Objektorientert
programmering
I dag
Moderne
paradigmer

Norge har vært pionerer innen objektorientert programmering! 🇳🇴

Problemer med tradisjonell programmering

Problemer

  • Kode blir vanskelig å organisere
  • Mye gjentagelse av kode
  • Vanskelig å vedlikeholde
  • Feil i én del påvirker hele programmet
  • Vanskelig å samarbeide i team

OOP løsninger

  • Organisert i klasser og objekter
  • Gjenbruk gjennom arv
  • Modulær struktur
  • Innkapsling beskytter data
  • Klarere ansvarsfordeling
// Tradisjonell tilnærming - alt i én stor funksjon void behandleBiler() { // 500 linjer kode for alt om biler... // Vanskelig å forstå og vedlikeholde! }

Hva er et objekt?

Et objekt er en samling av relaterte data og funksjoner som arbeider sammen:

Data
(Egenskaper)
+
Funksjoner
(Oppførsel)
=
Objekt
🤔 Tenk-par-del: Finn objekter rundt deg i klasserommet
Eksempler: Datamaskin (egenskaper: merke, hastighet; oppførsel: start, kjør program), Tavle (egenskaper: farge, størrelse; oppførsel: skriv, slett), Mobiltelefon (egenskaper: nummer, batteri; oppførsel: ring, send SMS)

Nøkkelpoeng: Objekter samler relatert informasjon og funksjonalitet på ett sted!

Objekter i den virkelige verden

La oss se på en bil som et objekt:

🚗 Bil-objektet

Egenskaper (data):

  • Farge
  • Merke og modell
  • Registreringsnummer
  • Hastighet
  • Drivstoffnivå

Oppførsel (metoder):

  • Start motor
  • Aksellerer
  • Brems
  • Skift gir
  • Slå av motor

Hver bil er et unikt objekt med samme type egenskaper og oppførsel!

Hva er en klasse?

En klasse er en oppskrift eller mal for å lage objekter:

Klasse
(Oppskrift)
Objekt 1
Objekt 2
Objekt 3

Analogi: Kakebaking 🍰

  • Oppskrift = Klasse (beskriver hvordan man lager kaker)
  • Ferdig kake = Objekt (en faktisk kake laget fra oppskriften)
  • Du kan lage mange kaker (objekter) fra samme oppskrift (klasse)
  • Hver kake kan være litt unik (forskjellige verdier for egenskaper)
🎯 Spørsmål: Hvis "Bil" er en klasse, hva er da objekter?
Objekter er de faktiske bilene: "Din røde Toyota", "Naboens blå BMW", osv. Hver bil er et unikt objekt laget fra Bil-klassen!

Enkel Java-klasse

La oss se på en enkel Java-klasse for en Person:

public class Person { // Egenskaper (felter) private String navn; private int alder; // Konstruktør public Person(String navn, int alder) { this.navn = navn; this.alder = alder; } // Metoder (oppførsel) public void siHei() { System.out.println("Hei, jeg heter " + navn); } public void bliEtÅrEldre() { alder++; } }

Denne klassen definerer hvordan Person-objekter skal se ut og oppføre seg.

Lage objekter fra klassen

Nå kan vi lage faktiske Person-objekter:

public class PersonTest { public static void main(String[] args) { // Lage objekter Person student1 = new Person("Ola", 20); Person student2 = new Person("Kari", 19); // Bruke objektene student1.siHei(); // "Hei, jeg heter Ola" student2.siHei(); // "Hei, jeg heter Kari" student1.bliEtÅrEldre(); // Nå er student1 21 år gammel } }
💡 Diskusjon: Hvorfor er det nyttig å kunne lage mange objekter fra samme klasse?
Det lar oss gjenbruke kode! Vi trenger ikke å skrive ny kode for hver person - vi bruker samme mal (klasse) men med forskjellige verdier (objekter).

Innkapsling - Beskytte data

Et viktig prinsipp i OOP er å beskytte objektets interne data:

❌ Uten innkapsling

person.alder = -50; // Ugyldig!

✅ Med innkapsling

person.setAlder(25); // Kontrollert!
public class Person { private int alder; // Beskyttet! public void setAlder(int nyAlder) { if (nyAlder >= 0 && nyAlder <= 150) { this.alder = nyAlder; } else { System.out.println("Ugyldig alder!"); } } public int getAlder() { return alder; } }

Hovedfordeler med OOP

🔧 Modularitet

Kode er organisert i separate, gjenbrukbare moduler

🔒 Innkapsling

Data er beskyttet og kan kun endres på kontrollerte måter

🔄 Gjenbruk

Klasser kan brukes om igjen i forskjellige prosjekter

🛠️ Vedlikehold

Enklere å finne og fikse feil, legge til ny funksjonalitet

Resultat: Raskere utvikling, færre feil, lettere samarbeid!

🎯 Praktisk øvelse: Identifiser objekter

Oppgave: Velg et domene (for eksempel bibliotek, skole, butikk) og identifiser:

  • 3-4 klasser som kan være nyttige
  • Egenskaper (data) for hver klasse
  • Metoder (oppførsel) for hver klasse
⏰ Tid: 10 minutter

Deretter: Diskuter med sidemannen din!

💡 Eksempel: Hva kan være objekter i et biblioteksystem?
Klasser: Bok, Låner, Bibliotek, Ansatt
Bok: Egenskaper (tittel, forfatter, ISBN); Metoder (lånes, leveres)
Låner: Egenskaper (navn, medlemsnummer); Metoder (låne, levere)

Problemløsning med OOP

OOP gir oss en naturlig måte å tenke på problemer:

1. Identifiser objekter
2. Definer egenskaper
3. Definer oppførsel
4. Implementer klasser

Eksempel: Bankystem

Objekter:

  • Konto
  • Kunde
  • Bank
  • Transaksjon

Relasjoner:

  • Kunde har kontoer
  • Konto tilhører bank
  • Transaksjoner påvirker kontoer

Sammenligning: OOP vs Prosedyrell

Prosedyrell tilnærming

void printStudentInfo(String name, int age) { System.out.println(name + ", " + age); } void updateStudentAge(int newAge) { // Oppdater alder } // Separate funksjoner for alt...

Objektorientert tilnærming

class Student { private String name; private int age; public void printInfo() { System.out.println(name + ", " + age); } public void updateAge(int newAge) { this.age = newAge; } }

OOP samler relatert data og funksjoner sammen!

Abstraksjon - Skjule kompleksitet

OOP lar oss skjule komplekse detaljer og fokusere på det viktige:

🚗 Bil-eksempel

Komplekse detaljer (skjult):

  • Motorens forbrenningsprosess
  • Girkassens mekanikk
  • Elektroniske kontrollsystemer
  • Bremse- og styresystemer

Enkelt grensesnitt:

  • Gasspedal
  • Brems
  • Ratt
  • Girstang

Du trenger ikke å forstå motoren for å kjøre bilen!

Gjenbruk gjennom arv

OOP lar oss bygge på eksisterende klasser:

Kjøretøy
(Generell klasse)
Bil
Motorsykkel
Lastebil
// Felles egenskaper og metoder class Kjøretøy { protected String registreringsnummer; protected int hastighet; public void start() { /* felles oppførsel */ } public void stopp() { /* felles oppførsel */ } } // Spesialiserte klasser class Bil extends Kjøretøy { private int antallDører; // Bil-spesifikke metoder }

Fordel: Mindre kode, konsistent oppførsel, lettere vedlikehold!

Polymorfisme - "Mange former"

Samme handling kan utføres forskjellig av forskjellige objekter:

🎵 Musikk-eksempel

// Alle kan "spille", men på forskjellige måter piano.spill(); // Spiller pianotoner gitar.spill(); // Spiller gitartoner trommer.spill(); // Spiller trommerytme
🤔 Spørsmål: Kan du tenke på andre eksempler på polymorfisme?
Eksempler: Dyr som lager lyd (hund bjeff, katt mjau), Transportmidler som beveger seg (bil kjører, fly flyr, båt seiler), Figurer som tegnes (sirkel, firkant, trekant)

Polymorfisme gjør koden fleksibel og utvidbar!

Når bør vi bruke OOP?

✅ OOP er bra for:

  • Store, komplekse systemer
  • Team-utvikling
  • GUI-applikasjoner
  • Spill-utvikling
  • Web-applikasjoner
  • Database-applikasjoner

⚠️ Andre tilnærminger kan være bedre for:

  • Enkle script
  • Matematiske beregninger
  • Databehandling
  • Systemadministrasjon
  • Prototype-utvikling

Velg riktig verktøy for oppgaven!

Oppsummering

Objektorientert programmering gir oss:

🏗️ Struktur

Organisert kode i klasser og objekter

🔄 Gjenbruk

Mindre kode, mer effektivitet

🔒 Sikkerhet

Innkapsling beskytter data

🤝 Samarbeid

Klarere ansvarsfordeling

Nøkkelbegreper du har lært:

  • Klasse: Oppskrift/mal for objekter
  • Objekt: Faktisk instans av en klasse
  • Innkapsling: Beskytte data og kontrollere tilgang
  • Abstraksjon: Skjule kompleksitet

Neste steg i din OOP-reise

🎯 Hjemmeoppgave

Forbered deg til neste økt:

  • Les kapittel 1-2 i læreboken
  • Installer Java Development Kit (JDK) og IDE
  • Tenk på et domeneproblem du vil løse med OOP
📅 Frist: Til neste forelesning

📚 Neste økt: Grunnleggende Java-syntaks for OOP

  • Klassenes anatomi, felter, metoder
  • Konstruktører og this-nøkkelordet
  • Lage din første Point-klasse
  • Praktiske øvelser
💭 Refleksjon: Hva var det mest interessante du lærte i dag?
Ta deg tid til å tenke gjennom det du har lært. Diskuter gjerne med medstudenter!

Lykke til med objektorientert programmering! 🚀

Spørsmål og diskusjon

💬 Tid for spørsmål!

Har du spørsmål om:

  • Forskjellen mellom klasser og objekter?
  • Hvorfor OOP er bedre enn prosedyrell programmering?
  • Praktiske eksempler på OOP?
  • Hvordan komme i gang med Java?

🗨️ Diskusjonsaktivitet

I grupper på 3-4 personer:

  • Diskuter et system dere alle kjenner (f.eks. sosiale medier, nettbutikk)
  • Identifiser hvilke klasser og objekter som finnes
  • Hvordan ville dere organisert koden objektorientert?
⏰ Tid: 8 minutter

Deretter: En gruppe presenterer sine tanker!

Vi sees neste gang! 👋