donderdag 29 maart 2012

Appels en peren in Java

Appels en peren in Java

Java is een object georiënteerde taal. Een van de basis beginselen van object georiënteerd denken is om dingen om je heen te classificeren op gedrag. Al vroeg op school worden we geconfronteerd met deze denkwijze, zonder dat we daar direct bewust van zijn. De uitspraak “Je mag geen appels met peren vergelijken” is voor de meesten van ons een herkenbare uitspraak. Wat maakt het dat we appels en peren dan niet mogen vergelijken?



Blijkbaar worden appels en peren anders gezien en wordt er op een bepaald niveau gediscrimineerd. Blijkbaar hebben appels en peren ander gedrag doordat ze andere eigenschappen hebben. De vorm van een appel is anders dan die van een peer. Een peer smaakt anders dan een appel. De boom waaraan de appel groeit ziet er ook anders uit dan die van de peer.


Er zijn ook mensen die zeggen dat je een appel wel mag vergelijken met een peer. Het niveau waarop deze uitspraak gestoeld wordt, is meestal fruit. Een appel en een peer behoren tot de “fruit-familie”. Op het niveau van fruit zou je mogen zeggen dat een appel en een peer beiden een boomvrucht zijn en dan is er geen onderscheidend gedrag tussen beiden. Als de redenatie andersom wordt geformuleerd kan niet gesteld worden dat een boomvrucht altijd een appel is.


Fruit is een abstractie van een (concrete classificatie) peer of een (concrete classificatie) appel of iets anders dat tot de “fruit-familie” (abstracte classificatie) behoort. Dit wordt beschreven als overerving. Een appel is een kind / afstammeling van de “fruit-familie”, wat ook geldt voor de peer. Overerving is een uitbreiding en/of aanpassing van het gedrag van de ouder.


En wat heeft dat dan te maken met Java? Best veel, alle beschrijvingen van gedrag worden uitgewerkt in programma code. Alles in Java is beschreven in de vorm van een class(ificatie), dus ook een object / ding. De class “Object” is de meest hoog haalbare abstractie van “iets” in Java.


De beschrijvingen van gedrag in Java worden uitgedrukt in “methods”. Als er een concretisatie wordt gemaakt van een concrete classificatie dan kan het gedrag van de concretisatie aangesproken gaan worden. Het toevoegen van zo'n concretisatie noemen we binnen Java instantiëren en zo'n concretisatie binnen een classificatie wordt dan een instantie genoemd. Door overerving krijgen de afstammelingen (classificaties) ook het gedrag mee van de “familie” (“iets” in Java), en daar zit hem nu de kneep!


De class Object wordt meegeleverd met Java waarin een aantal belangrijke gedragingen zijn ingebouwd, waaronder het vergelijken van een instantie van een class(ificatie) met een andere instantie. Alle classificaties zullen dat gedrag erven. Er zal voldoende discriminerend gedrag geïmplementeerd moeten in een nieuwe class. Er zijn regels (contracten) verbonden aan deze methods die geërfd worden vanuit Java.


De contracten van methods zijn er omdat ze verband houden met andere delen van Java. Een voorbeeld is dat er in Java een “object-familie” is dat object referenties bijhoudt. Dit zijn de verzamelingen, bijvoorbeeld lijstjes en setjes. Deze verzamelingen hebben allemaal verschillende manieren voor het bijhouden van objectreferenties. De manier van bijhouden kan gebeuren op verschillende manieren waaronder ook het vergelijken van de object instanties die verzameld worden. Sommige verzamelingen voegen bijvoorbeeld geen referentie toe doordat deze hetzelfde is aan één die al voorkomt in de verzameling.


Een verkeerde vergelijking kan dan erg vervelende consequenties hebben. Bijvoorbeeld uw salaris is niet gestort op uw rekening omdat de bank heeft besloten dat salaris instanties logisch hetzelfde zijn op basis van een geldbedrag.


In de volgende blogs zullen deze concepten stap voor stap verder worden besproken en uitgewerkt in code.