Objektorientert programmering
Fra Wikipedia, den frie encyklopedi.
Objektorientert programmering er en metodikk som er i utstrakt bruk i dataprogrammering. Den blir ofte satt i kontrast til prosedyreorientert programmering, selv om disse to egentlig ikke er «motsatte» metoder.
| Innholdsfortegnelse |
Datamodellering
I objektorientert programmering modelleres den virkelige verden, som et program skal «arbeide» med, ved hjelp av objekter. Hvert objekt har en definert mengde med egenskaper, og også en definert mengde med operasjoner som kan utføres på disse egenskapene. Eksempelvis vil en bil ha gitte egenskaper, som for eksempel farge, årsmodell, dekkstørrelse, antall gir, maksimal last og bensintype (eller kanskje den bruker diesel ...). Bilen har også operasjoner som kan gjøres: starte motoren, kjøre, bytte gir, fylle bensin osv. Innen objektorientert programmering kalles disse ofte «metoder», mens egenskapene kalles «attributter». Noen attributter kan forandres på av de ulike metodene (girets stilling, mengde bensin på tanken), mens andre er faste (årsmodell).
Viktige begreper
Et sentralt begrep innen objektorientert programmering er innkapsling. Det innebærer at andre objekter aldri skal ha direkte tilgang til å endre på et objekts attributter. Dette må alltid gjøres ved hjelp av en av metodene som er definert for objektet.
Et annet og minst like viktig begrep er arv. I den virkelige verden fins det mange objekter som har noen felles egenskaper, og dessuten noen felles metoder som kan utføres. For eksempel er både busser og personbiler kjøretøy, som har et sett med egenskaper som begge må ha, for eksempel årsmodell, farge, dekkstørrelse, drivstofftype og akselavstand. Man kan da definere en objekttype «kjøretøy» (dette kalles en klasse, mer om dette om noen strakser) som er felles for alle kjøretøy. Denne felles klassen har også et sett med metoder, for eksempel for å fylle drivstoff eller starte motoren. Man kan så definere nye typer, for eksempel «buss» og «personbil», som arver attributtene og metodene til «kjøretøy», men som i tillegg definerer sine egne tilleggsattributter og metoder. I mange tilfeller er det også ønskelig å overstyre metodene til den såkalte superklassen, for eksempel ved å la personbiler ha en annen implementasjon av hvordan dørene åpnes.
Polymorfisme
Et vanskelig ord, men det er et enkelt konsept som ligger bak: Forskjellige objekter, av forskjellig type, kan ofte reagere på samme melding, men med ulike implementasjoner og resultat. Ulike typer objekter kan altså reagere på samme type meldinger, og svare på sin egen måte.
Abstraksjon
Det er svært viktig innen objektorientert modellering å sørge for at ingen objekter har for mange ansvarsområder. Man kunne tenke seg at en bil har egne attributter for å holde rede på bensinstand, gir, om dørene er åpne og så videre. I stedet vil det ofte være hensiktsmessig å la bensintanken, giret og dørene være egne objekter som har attributter og metoder for å manipulere disse attributtene.
Objekter og klasser
Vi har allerede innført begrepene objekter og klasser. En klasse er innen objektorientert programmering et sett med spesifikasjoner for hvordan et objekt skal se ut. En klasse er altså ikke en representasjon av et objekt. For å lage et objekt må man instansiere klassen, og man sitter da igjen med ett enkelt objekt «av den klassen».
Meldinger
Objekter i den virkelige verden er avhengige av å kunne kommunisere med hverandre på en eller annen måte. I objektorientert modellering snakker man om at objekter må kunne sende hverandre «meldinger». Dette kan skje ved at et objekt ber et annet objekt utføre en metode. For eksempel kan et sjåførobjekt be et bilobjekt om å starte motoren sin, og si fra hvordan resultatet ble. Bilobjektet ber i sin tur sitt et motorobjekt om å starte. Motorobjektet kvitterer så med at dette gikk bra, og at motoren er startet. Bilobjektet sier så fra til sjåførobjektet om dette.
Hendelser
I tradisjonell prosedyreorientert programmering bruker man ofte teknikker der man overvåker tilstanden til objekter og utfører handlinger når endringene inntreffer. Objektorienterte teknikker benytter ofte såkalte hendelser. La oss tenke oss at et sjåførobjekt ønsker å vite om det dersom det oppstår en feil i motorobjektet til et bilobjekt. Sjåførobjektet kan da si fra, enten til bilobjektet eller direkte til motorobjektet, avhengig av hva som er mest hensiktsmessig, at det ønsker å bli informert om slike hendelser. Sjåførobjektet kan dermed konsentrere seg om sine andre oppgaver (som å holde bilobjektet på veien), og får kun beskjed om hendelsen når den inntreffer, og kan utføre nødvendige operasjoner som respons på dette.
Informasjon om hendelser kan sendes til mange objekter samtidig (eller ingen), og samme objekt kan lytte etter flere forskjellige hendelsestyper.
Om objektorienterte språk og ytelse
Det blir ofte hevdet fra enkelte leirer at objektorienterte språk, og da spesielt de som er basert på såkalt bytekode, for eksempel java og C#, gir ineffektive og tunge programmer. Det er korrekt at kjøring av bytekode gir ytelsesulemper i forhold til å kjøre såkalte «native» kompilerte programmer. Dette gapet er imidlertid raskt i ferd med å lukke seg, og i mange tilfeller kan gode kodeteknikker gi så å si like god ytelse ved kjøring av bytekode. Andre avanserte teknikker som «Just in time»-kompilering og kompilering til «native» kode, fjerner forskjellene helt, eller kan til og med gi ytelsesfordeler.
Det er for øvrig ingen sammenheng mellom objektorientering og kjøremåte – objektorienterte språk kan godt kompileres til «native» kode, og motsatt kan prosedyreorienterte språk kjøres som bytekode.
God kode er avhengig av programmerere, ikke av programmeringsspråk.
Se også
Relaterte begreper:
- Abstrakte klasser
- Datatyper
- Delegater
- Grensesnitt («interface»)
- Statiske attributter/metoder (statisk kontekst)
- UML (modellering)
- Metodekombinasjoner

