OOP - Object Oriented Programming

© H-P Ulven 02.06.14

Se også:


Introduksjon til objektorientering:

Kom på 80-tallet som en følge av den såkalte "programvarekrisen", som må sies å eksistere fremdeles.
Programvarekrisen eksisterer fremdeles, fordi:

Mest kjente objektorienterte språk: Smalltalk, Eiffel, Java.

C++, Flash Actionscript og andre må sies å være objektbaserte språk, da de ikke helt fyller kriteriene for å være objektorienterte.

Det er verdt å merke seg at OOP er en norsk oppfinnelse, konseptet ble opprinnelig laget og implementert i programmeringsspråket Simula av Kristen Nygaard og Ole-Johan Dahl på Norsk Regnesentral på slutten av 60-tallet!
De var så forut for sin tid at det gikk nesten 20 år før programmerere verden over skjønte hvor genialt det var, og mange har fremdeles problemer med å skjønne at objektorientering er eneste fornuftige metoden å planlegge, lage og vedlikeholde programvare på.

Nygaard og Dahl er blandt de mest kjente IT-folk i verden og må sies å være i samme eksklusive gruppe som Donald Knuth og Niklaus Wirth!

Hensikten med objektorientering:

Prinsipper i OOP:

For å oppnå hensikten om å lage bedre programvare, definerer vi OOP som programmering der det er støtte i programmeringsspråket for disse prinsippene:

Disse prinsippene blir som oftest realisert gjennom følgende mekanismer:

Mekanismer:

Forklaring av begrepene over:

Abstraksjon:

Abstraksjon vil si å skjule kompleksitet og trekke ut det overordnede og viktigste. (Abstrahere.)

Når vi lager klasser vil klassene inneholde mye kode og variabler som må lages for å få klassen til å fungere slik den skal:
Brukeren av klassen trenger ikke vite om alle disse interne detaljene, han trenger bare vite om grensesnittet, det vil si de egenskapene og metodene som er synlige på utsiden av klassen, her eksemplifisert med en klasse Ball:

Ball
x
y
radius
color
move(x,y)
moveTo(x,y)
hide()
show()

Dette er alt brukeren av klassen trenger å vite om Ball. Bare programmereren som har laget klassen trenger å kjenne implementasjonen av kode, variabler og datatyper internt i klassen.

Abstraksjonen Klasse gjør det mulig å dele opp et program i deler (modularisere) på en fornuftig, strukturert og logisk måte. Dette sammen med beskrivelsesteknikker som UML-diagram (se figuren over) letter planleggingen av et program.

Denne oppdelingen i moduler gjør det også mulig å å lage gode modeller av virkeligheten, da klasser kan stå i et en-til-en forhold til ting og objekter i den virkeligheten vi modellerer.

Objekter:

Klassen er egentlig en definisjon eller arbeidstegning for produksjon av objekter. Vi kan tenke oss klassen som bruksanvisningen for en fabrikk som lager objekter.

Vi får fabrikken til å lage objekter på denne måten:

var ball_1: Ball = new Ball();
var ball_2: Ball = new Ball();

Objekter, eller instanser, er aktører som lever og gjør ting i programmet når det kjøres.

Innkapsling:

Skjulingen av detaljer i en klasse er også innkapsling, det vil si at vi skjuler og derfor også beskytter interne detaljer i klassen.
Denne beskyttelsen er viktig, da den hindrer programmere i å lage nye feil og bugs ved å få tilgang til kode som de helst ikke bør klusse med!

Programmeren kan bestemme synlighet og beskyttelse ved å angi om en funksjon eller variabel skal være private eller public.
(Metoder er public funksjoner, mens egenskaper er public variabler.)

Beskyttelsen gir også muligheter til å lage så mye uavhengighet som mulig mellom deler av et større program.
(Dårlige programmerere lager ofte uønskede avhengigheter mellom forskjellige deler i et program, noe som kan føre til feil som er vanskelige å finne og hvor retting av en slik feil kan få uønskede virkninger helt andre steder i programmet. Klasser gjør det litt vanskeligere for dårlige programmere å lage avhengigheter.)

Arv:

Arv er en mekansime knyttet til klasser som gir muligheter for polymorfi (se senere) , gjenbruk og utvidbarhet.

Klassen Ball som er nevnt tidligere ville antagelig være laget som en utvidelse (extends) av en allerede eksisterende klasse Circle, omtrent slik:

Ved å deklarere en klasse med extends på denne måten

class Ball extends Circle {
   ...
}//class Ball

oppnår vi at vår klasse Ball får med seg, eller arver, alle egenskaper og metoder fra klassen Circle. I tillegg kan vi legge inn egne spesialiserte egenskaper og metoder som passer til vårt formål. (Få en grafisk sirkelfigur til å bevege seg og bli en ball i et spill.)

Dette gir som vi skjønner både gjenbruk og utvidbarhet!

(Vi bruker allerede eksisterende kode og ferdige klasser, og vi tilpasser og utvider dem til våre spesielle formål.)

Polymorfi:

Polymorfi vil si at man har mulighet til å behandle forskjellige ting på samme måte når de har noen felles egenskaper og metoder.

Dette var ikke mulig i eldre programmeringsspråk, men er i objektorienterte språk gjort mulig ved at alle objekter laget av klasser som har arvet fra en overordnet klasse, kan behandles på samme måte som objekter laget av den overordnede klassen!

Eksempel:

Hvis alle bevegelige aktører i et spill, eksempelvis prosjektiler, kuler, piler, sverd osv. arver fra en overordnet klasse Actor, hvor meoden update() er definert, kan vi legge alle aktører i en tabell og oppdatere alle ved å få en sløyfe til å gå gjennom tabellen:

for(var i: int = 0; i<actorTable.length();i++) {
   var actor: Actor = actorTable[i];
    actor.update();
}//for

Alle aktører har arvet metoden update() og kan behandles som oppdaterbare objekter av typen Actor, selv om de er definert i underklasser som utvidelser av den opprinnelige klassen Actor.

Mer avanserte språk, som Java og Eiffel, har i tillegg en mekanisme som heter interface, som gjør det mulig å lage polymorfi uten å bruke arve-mekanismen.

Oppsummering:

Objektorientering har som hensikt å

gi mindre feil og bedre planlegging, koding og vedlikehold av programvare

ved å legge inn mekanismene

klasser, objekter, arv og polymorfi, med modifikatorer private og public

som resulterer i

bedre programvare gjennom bedre planlegging, sikrere kode og gjenbruk og utvidelser av eksisterende feilfri kode.