Objectoriëntatie
Objectoriëntatie of OO is de zienswijze die gebruikt wordt bij het objectgeoriënteerd programmeren. Bij deze benadering wordt programmatuur opgebouwd als een verzameling van interagerende objecten die elk behoren tot een soort of klasse. Objecten spelen de rol die variabelen spelen in klassieke programmatuur. De klassen daarentegen spelen de rol van de types.
Inhoud |
[bewerk] Algemeen
Het keurslijf van een object wordt een klasse (Engels: class) genoemd. De klasse is de blauwdruk voor elk object van die klasse. Een specifiek object is dus altijd een instantie van een bepaalde klasse. Anders gezegd: de tafel waaraan u nu zit is een object, en deze is van de klasse tafel. De termen klasse en object worden vaak door elkaar gebruikt, soms ten onrechte.
In een klasse wordt
- door middel van attributen vastgelegd wat de morfologie is van de objecten die tot die klasse behoren, m.a.w. hun vormelijke kenmerken;
- door middel van methoden alle potentiële gedragingen van die objecten geprogrammeerd - berekeningen, bewerkingen, acties, replieken etc. (functies in klassieke programmeertalen).
In principe geldt op het niveau van het object inkapseling, de attributen zijn niet opvraagbaar of wijzigbaar tenzij gebruikgemaakt wordt van de methoden die informatie geven of de interne toestand van het object wijzigen.
Objectgeoriënteerd programmeren onderscheidt zich van procedureel programmeren door de uitermate grote modulariteit in de opbouw van software (er worden in feite geen programma's meer geschreven maar enkel op zich staande klassen of hiërarchieën van klassen) en in principe onbeperkte herbruikbaarheid: om een bepaald probleem softwarematig op te lossen neemt men de nodige bestaande klassen (onderdelen), en brengt die samen in een nieuwe klasse (de oplossing).
[bewerk] Inkapseling
Inkapseling (Engels: encapsulation) is wat objectoriëntatie onderscheidt van procedureel programmeren. Een object bestaat uit een hoeveelheid data en de bewerkingen daarop. De data is echter niet rechtstreeks te benaderen (bij goede OO althans) maar moet via methoden (en eventueel properties, een soort methoden) opgevraagd en gemanipuleerd worden. Hierdoor is het mogelijk de implementatie van een klasse aan te passen, zonder dat de programmatuur die deze klasse gebruikt dit merkt. Belangrijk is ook dat ingewikkelde zaken voor de gebruiker van de klasse verborgen blijven. Dit is met OO een stuk eenvoudiger dan met procedureel programmeren.
[bewerk] Overerving (Inheritance)
Een van de krachtige instrumenten van OO is de mogelijkheid tot hiërarchische classificatie (een moeilijke bezigheid zo leert ons Wikipedia). Een superklasse op het hoogste niveau kan - meerdere lagen diep - opgesplitst worden in deelklassen. Daarbij 'erft' (de term 'accumuleert' geeft beter aan wat werkelijk gebeurt dan 'erft' maar is niet ingeburgerd) elke klasse op het laagste niveau alle attributen en methoden van de klassen op de hogere niveaus. Dat mechanisme noemen we overerving (inheritance).
Inheritance laat ook toe varianten van klassen te maken (we spreken dan van basis- en afgeleide klassen). Aangezien de regel geldt dat een afgeleide klasse steeds in de plaats kan treden van een basisklasse ontstaat daardoor ruimte voor polymorfie.
[bewerk] OO Programming Structure
OOPS is niet eenvoudig, vooral voor programmeurs die gewend zijn procedureel te programmeren. De OO-ontwerper verzamelt eerst alle mogelijke reeds bestaande klassen die inzetbaar zijn in het domein waarvoor hij/zij software ontwerpt. Die smeedt hij/zij aan elkaar door middel van nieuwe of afgeleide klassen tot de uiteindelijke applicatie: in wezen niets meer dan de creatie van één object van de applicatieklasse.
Er zijn programmeurs die het OOPS-model verwerpen en vinden dat het procedureel programmeren de voorkeur heeft. Anderen zijn eerder geneigd een uitgebreide library aan klassen te gebruiken en deze d.m.v. procedurele code samen te laten werken.
[bewerk] Programmeertalen
Voorbeelden van objectgeoriënteerde talen zijn:
- C sharp (C#)
- C plus plus (C++)
- Borland Delphi
- Eiffel
- Freepascal
- Java
- PHP (vanaf versie 5)
- Python
- Ruby
- Smalltalk
- Virtualpascal
- Magic
- Game Maker Language (Game Maker)
- Visual Objects
Voorbeelden van lineaire talen zijn:
[bewerk] Codevoorbeeld
Voorbeeld van een klasse Cirkel. De klassen cGetal, cEenheid, cPunt-in-vlak, cLengte-in-Eenheid, etc. worden als bestaand beschouwd.
klasse cCirkel privaat: straal = cLengte-in-Eenheid het enige attribuut, ingekapseld publiek: constructoren: (dienen om een nieuw object te maken) cCirkel(cLengte-in-eenheid s) straal=s cCirkel(cGetal l, cEenheid e) straal=nieuw cLengte-in-eenheid(l, e) maakt met l en e een nieuw cLengte-in-eenheid-object informant: (dienen om info over het object te vragen) Straal? antwoord: straal als cLengte-in-eenheid-object veredelaars: (veredelen de informatie van een object) Oppervlakte? cGetal o=pi*(straal->Lengte?)**2 cEenheid e=(straal->Eenheid?)->Kwadrateer antwoord: nieuw cOppervl-in-eenheid(o, e) Omtrek? cGetal o=2*pi*(straal->Lengte? antwoord: nieuw cLengte-in-eenheid(o, straal->Eenheid? manipulator: HerschaalNaar(cEenheid e) straal->HerschaalNaar(e) HerschaalMet (cGetal g) straal->HerschaalMet (g) klasse cCirkel-in-vlak erft van cCirkel privaat: middelpunt = cPunt-in-vlak de straal komt in de basisklasse publiek constructoren: cCirkel-in-vlak(cPunt-in-vlak p, cLengte-in-eenheid l) cCirkel (l) middelpunt = p cCirkel-in-vlak(cPunt-in-vlak p1, cPunt-in-vlak p2, cPunt-in-vlak p3, cEenheid e) (moet uit de drie punten de straal en het middelpunt berekenen) informanten: Middelpunt? antwoord: middelpunt als cPunt-in-vlak veredeling: (wordt overgeërfd) manipulator: (wordt overgeërfd) regisseur: Teken (tekent de cirkel)
[bewerk] Voor- en nadelen
Objectgeoriënteerd programmeren kan de herbruikbaarheid van code sterk vergroten. Toch is de in de jaren 90 beoogde herbruikbaarheid van zakenobjecten nooit helemaal waargemaakt. De herbruikbaarheid heeft zich voornamelijk bewezen voor technische objecten. Bijkomend voordeel hiervan is dat fouten maar op één plaats voorkomen. Bij OO programmeren wordt veel minder vaak code gekopieerd dan bij andere methoden.
De grootste verdienste van OO is waarschijnlijk de inkapseling en de interface van klassen/objecten. Hierdoor is het mogelijk geworden omvangrijke programmatuur goed onderhoudbaar te maken. Met puur structureel programmeren is dit een ware heksentoer.
Nadelen kleven er ook aan: als de structuur van begin af aan niet goed is opgezet, kan op een gegeven moment de overerving tegen de programmeur gaan werken. Vaak gebeurt dit als van tevoren niet duidelijk was wat de uiteindelijke structuur zou zijn.
In de praktijk gebeurt het veel dat ervaren programmeurs de objectdeclaraties ontwerpen, en dat de (relatief) onervaren programmeurs de feitelijke code invullen.
[bewerk] Objectgeoriënteerde gebruikersinterface
Een geheel ander soort objectgeoriënteerdheid treft men aan in de objectgeoriënteerde gebruikersinterface. Dit is een vorm van een grafische gebruikersinterface waarbij de nadruk niet ligt op de programma's die gebruikt worden om taken uit te voeren, maar op de documenten of bestanden waarmee men werkt. De Workplace Shell van OS/2 is een voorbeeld van een dergelijke interface.