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:
- Forklare hva objektorientert programmering (OOP) er og hvorfor det er nyttig
- Identifisere problemer som OOP løser i forhold til tradisjonell programmering
- Forstå grunnleggende konsepter som klasser og objekter
- Gjenkjenne objekter i den virkelige verden og hvordan de kan modelleres
- Forstå hvordan OOP gjør kode mer organisert og gjenbrukbar
💭 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
- Simula-67 (1967): Det første objektorienterte språket, utviklet i Oslo!
- Smalltalk (1970-80): Populariserte OOP-konsepter
- C++ (1985): Brakte OOP til mainstream
- Java (1995): Gjorde OOP tilgjengelig for alle
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 {
private String navn;
private int alder;
public Person(String navn, int alder) {
this.navn = navn;
this.alder = alder;
}
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) {
Person student1 = new Person("Ola", 20);
Person student2 = new Person("Kari", 19);
student1.siHei();
student2.siHei();
student1.bliEtÅrEldre();
}
}
💡 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;
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) {
}
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)
↓
↓
class Kjøretøy {
protected String registreringsnummer;
protected int hastighet;
public void start() {
}
public void stopp() {
}
}
class Bil extends Kjøretøy {
private int antallDører;
}
Fordel: Mindre kode, konsistent oppførsel, lettere vedlikehold!
Polymorfisme - "Mange former"
Samme handling kan utføres forskjellig av forskjellige objekter:
🎵 Musikk-eksempel
piano.spill();
gitar.spill();
trommer.spill();
🤔 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! 👋