Over Objectoriëntatie (v1.1) J.P. Sturkenboom 30 januari 2012
Dit betreft een eerste versie van dit document. Meld fouten via
[email protected] of bij jouw docent in het werkcollege. Tegenover elke eerste keer dat een fout gemeld wordt staat een chocoladereep naar keuze uit de automaat op de 6e verdieping. This work is licensed under a Creative Commons License.
Over Objectoriëntatie
Inleiding object-‐georiënteerd programmeren In het vak Programmeren ga je kennismaken met de taal Actionscript, een objectgeoriënteerde programmeertaal die gebruikt wordt om functionaliteit aan Adobe Flash applicaties toe te voegen. Misschien vind je het heel leuk om te gaan programmeren en is dit precies waarom je voor Interactieve Media hebt gekozen. Het kan natuurlijk ook dat je helemaal geen zin hebt in het vak omdat je verwacht dat het ‘niet jouw ding’ is. In beide gevallen zal je in de loop van de komende weken toch behoorlijk wat regels code gaan ontwikkelen en het is hierbij handig als je een aantal zaken goed op een rijtje hebt. Om een begin te maken met het object-georiënteerd programmeren van applicaties in de taal Actionscript dient eerst een helder beeld verkregen te worden van de fundamenten, de terminologie en de abstracte concepten die in deze manier van programmeren gebruikt worden. In dit inleidend schrijven komen de verschillende fundamenten van het object-georiënteerd programmeren aan bod. Allereerst zal behandeld worden wat de betekenis van de term ‘object-georiënteerd programmeren’ is, hoe deze formeel gedefinieerd is en hoe we deze term in het dagelijks spreken gebruiken of gaan gebruiken. Vervolgens wordt gekeken naar de specifieke eigenschappen van een object-georiënteerde programmeertaal. De fundamenten van elke programmeertaal die aan bod komen zijn bibliotheken, klassen, methoden en variabelen. Schrik niet, deze termen worden allemaal uitgelegd. Na deze inleiding op programmeertheorie, waar in de colleges en werkgroepen veelvuldig aan zal worden gerefereerd, gaan we in op de praktijk. We kijken uitgebreid naar het basisrecept van een klasse in AS en er wordt aan de hand van code toegelicht hoe de eerder behandelde theoretische concepten verwezenlijkt worden in deze programmeertaal. Het lezen van code is een essentieel onderdeel bij het leren programmeren, door naar andermans code te kijken leer je hoe dingen gedaan worden, deze kan je dan vervolgens zelf inzetten.1 Objecten zullen vervolgens worden ontleed door de aandacht te richten op achtereenvolgens eigenschappen en methoden. Eigenschappen zijn de kenmerken van objecten en in methoden wordt de functionaliteit van een object beschreven.
Object Oriëntatie Actionscript is blijkbaar een object-georiënteerde programmeertaal, wat houdt dit nu precies in? Laten we eerst eens naar de betekenis van de term kijken. Allereerst is er de term object; in het dagelijks leven gebruiken we deze term om alles wat tastbaar is, de dingen om ons heen, aan te duiden. Voorbeelden van dingen die we gebruikelijk in ons hoofd hebben als we over een object spreken, dingen die we van nature aan duiden als object zijn bijvoorbeeld: een appel, een radiator, een
Ik durf te beweren dat elke programmeur ooit is begonnen met het ‘lenen’ van stukken code van anderen. Bij Interactieve Media hebben we zoals je weet strenge regels met betrekking tot plagiëren van teksten, deze regels gelden net zo goed voor code. Je mag code overnemen mits je aangeeft waar de code vandaan komt. 1
2
Over Objectoriëntatie geodriehoek, een beeldhouwwerk, een jampot en andere fysieke dingen. Wellicht zijn er meer zaken die vallen onder de term object. Een goed begin van het begrijpen van een woord is om dat woord op te zoeken in het woordenboek, Van Dale zegt er het volgende over: ob·ject het; o -en voorwerp (1, 2)
Als we vervolgens kijken hoe voorwerp uitgelegd wordt staat er: voor·werp het; o -en 1) iets wat men waarneemt, aanvat, bewerkt, liefheeft, haat enz. 2) (taalkundig) naam van dat zinsdeel dat een persoon, zaak enz. noemt die naast het onderwerp bij het gebeuren betrokken is: lijdend ~ zinsdeel dat de handeling ondergaat, bv. ‘Jan’ in ‘Piet belt Jan’; meewerkend ~ bv. ‘Jan’ in ‘Piet geeft Jan een duw’
Daar staan een heleboel werkwoorden achter elkaar, waarnemen duidt op iets wat we zien via de zintuigen, je vat iets aan als je het kunt pakken of kunt meenemen, bewerken is het maken van een aanpassing aan een bestaand iets, liefhebben is als je ergens dicht bij wilt zijn of je ergens goed bij voelt, omgekeerd is haten als je het liefst ergens ver vandaan blijft of er een slecht gevoel bij hebt. Voorbeelden van objecten kunnen dus blijkbaar gegeven worden door fysiek waarneembare zaken op te noemen, onze natuurlijke notie van het woord object blijkt juist. Daarnaast vallen ook abstractere begrippen als: een bankrekening (ik kan mijn bankrekening bewerken), mijn internetverbinding (deze heb ik lief), een URL (ik kan een URL bewerken) en een geometrische vorm (deze kan ik ergens in waarnemen) onder de term object. In moeilijke termen zou je kunnen stellen dat een object al datgene is waarop wij als subject betrekking kunnen hebben, datgene waar wij als mens onze aandacht op kunnen richten (maar dit wordt wel erg filosofisch). In programmeerland wordt de term ‘object’ op nagenoeg dezelfde wijze gehanteerd. Daarna volgt de term georiënteerd, wat wordt hier doorgaans mee bedoeld? Je kunt een oriëntatiejaar volgen aan hogescholen of universiteiten, je kunt je gevoel voor oriëntatie kwijt raken, bijvoorbeeld in de jungle of in een vreemde stad en in projectwerk spreken we over een oriëntatiefase. Ook kan je, zoals je nu aan het doen bent, je in een theorie oriënteren. In Van Dale staat: ge·ori·ën·teerd bn 1 gericht naar 2 gezind: communistisch ~
Dit zegt nog niet heel erg veel, de eerste uitleg is gericht naar. Daar kunnen we wellicht iets mee. De tweede uitleg: gezind, doet voor wat wij nodig hebben erg vreemd aan, het past niet in de betekenis die wij zoeken. Laten we verder kijken naar de uitleg van het woord gericht. ge·richt bn, bw met een bepaalde richting: ~ schieten, rich·ten richtte, h gericht 1 in een bepaalde richting stellen, plaatsen, brengen: een stuk geschut ~ op de vijand 2 in een bepaalde richting laten gaan: de steven, de koers ~ naar ergens heen varen 3 sturen, zenden: een brief, aan mij gericht; het woord tot iemand ~ aan- of toespreken
3
Over Objectoriëntatie Oriëntatie heeft dus kennelijk te maken met een bepaalde richting, een gericht zijn op iets. In het voorbeeld gericht schieten ben je gericht op een bepaald doel. Je kunt iets in een bepaalde richting laten gaan, in Van Dale wordt als voorbeeld de koers van een boot gebruikt maar je kunt natuurlijk ook in een bepaalde richting fietsen of lopen. Georiënteerd zijn betekent in dit opzicht gericht zijn, er is een richting bepaald, het is duidelijk waar we naar toe gaan. Tenslotte volgt de term ‘programmeren’, hierover stelt Van Dale het volgende: pro·gram·me·ren -meerde, h geprogrammeerd 1 (computer) programma’s maken 2 (radio, tv) een planning maken van de uit te zenden programma’s
De eerste uitleg is meteen een schot in de roos, het maken van computer programma’s is wat wordt bedoeld met de term programmeren, veel meer hoeft daar niet aan toegevoegd te worden. We hebben nu de drie losse termen met behulp van een woordenboek aan een klein hermeneutisch2 onderzoek onderworpen, laten we ze nu achter elkaar zetten en trachten te komen tot een mooie, definitieachtige volzin. Object-georiënteerd programmeren als samengevoegde term houdt bezien het voorgaande het volgende in: Ontwikkelen of maken van (computer)programma’s waarbij de ontwikkelaar gericht is op het gebruik van al dan niet abstracte voorwerpen. We waren begonnen bij het begrip ‘object georiënteerd programmeren’ en hebben nu door middel van een woordenboek een uitleg van wat dit betekend. Maar hebben we hiermee al grip op de term? Het lijkt zo te zijn dat de essentie van de vraag nog niet beantwoord is. We zullen verder op zoek moeten gaan. Object-georiënteerd programmeren is een manier van werken, een wijze van oplossen van programmeerproblemen. Een object-georiënteerde programmeertaal is een programmeertaal waarin deze stijl van programmeren op een goede manier ondersteund wordt. Actionscript is een taal waarin de object-georiënteerde stijl in meer of minder mate ondersteund is. Dat klinkt erg interessant, maar hoe wordt dit in de praktijk gebracht? Om duidelijk antwoord te kunnen geven op die vraag begin ik met een voorbeeld dat we ook in de filosofie tegenkomen.3 Bekijk het volgende figuur:
Aardbei
Aardbei
In een hermeneutisch onderzoek wordt gezocht naar de juiste uitleg van bepaalde woorden of teksten. Wat we net gedaan hebben is een onderzoek naar de betekenis van de term objectgeoriënteerd programmeren. Je kunt zeggen dat hermeneutiek ‘uitlegkunde’ is. 2
De theorie die hier bedoeld wordt is de type/token theorie: Wetzel, L. (2006 28-April). Types and Tokens. Retrieved 2010 26-1 from Stanford Encyclopedia of Philosophy: http://plato.stanford.edu/entries/types-tokens/ 3
4
Over Objectoriëntatie Hoeveel woorden tel je? In het ene opzicht kan je stellen dat er één woord in de rechthoek staat, in een ander opzicht staan er twee woorden. Waarin ligt precies het verschil? Dit ligt in de benadering van de woorden als klasse of als instantie.4 Bezien vanuit de positie van de klasse staat er één woord in de rechthoek, namelijk het woord aardbei, een klasse is een abstract en uniek ding. Met abstract wordt bedoeld dat je nooit in ‘echte’ wereld een klasse tegen zult komen, het is een denkbeeldig iets, een afgeleide van zaken die je in de echte wereld tegen komt, klassen zijn uniek in de zin dat er nooit twee exact hetzelfde zijn, de uniciteit maakt dat we over überhaupt over ‘klasse’ spreken. Instanties zijn daarentegen concrete particularia, bezien vanuit de positie van instantie staan er twee woorden in de rechthoek, namelijk tweemaal het woord aardbei. De relatie tussen klasse en instantie is als volgt, een klasse kan maar één keer voor komen. Als ergens twee aardbeien liggen zeggen we niet, daar liggen een aAardbei en een bAardbei, we zeggen dan: daar liggen twee voorwerpen van de klasse aardbei. De instantie is een exemplaar van een bepaalde klasse, een instantie heeft dus een bepaalde klasse. Er kunnen oneindig veel instanties zijn van één enkele klasse, stel je een aardbeienveld voor, er zijn vele instanties van aardbeien, maar ze zijn allemaal van de klasse aardbei. In object-georiënteerd programmeren spreken we over klassen en objecten, objecten zijn instanties van klassen. Net als bij voorgaand voorbeeld kunnen van een klasse meerdere objecten gemaakt worden, omgekeerd zijn objecten altijd van een bepaalde klasse, je zou kunnen zeggen van een bepaald type. Hoe die klassen en objecten er precies uitzien gaan we verderop bekijken onder het kopje classificatie, laten we eerst nog iets dieper ingaan op het principe van indelen gebaseerd op objecten.
Een hiërarchische indeling Wij mensen zijn gewend de wereld systematisch in te delen. Een van de eerste personen die inzag dat alle dingen om ons heen te vatten zijn in een systeem was de filosoof Aristoteles. In zijn boek Categoriae (Over de categorieën) wordt alles zo algemeen mogelijk geduid, dat wil zeggen dat de dingen worden benoemd en ingedeeld naar hun klassen en kenmerken, de eerste vier door Aristoteles onderkende categorieën zijn substantie – bijvoorbeeld paard of steen, kwantiteit – bijvoorbeeld zes of twee meter, kwaliteit – bijvoorbeeld wit of grammaticaal en relatie – bijvoorbeeld beter of groter dan.5 In de moderne wetenschap zijn nog steeds vele kenmerken van deze theorie te herkennen, als je biologie gehad hebt op de middelbare school herinner je wellicht de indeling in soort (genus) en geslacht (species) van alle dieren en plantensoorten. Bij het vak Nederlands vind je de indeling van woorden in werkwoorden, bijvoeglijk naamwoorden, lidwoorden en Omdat programmeertalen hoofdzakelijk Engels georiënteerd zijn worden deze termen vaak in het Engels toegepast, de vertalingen zijn respectievelijk ‘class’ en ‘instance’. De term object is uitwisselbaar, je schrijft deze in beide talen hetzelfde en de uitspraak komt ook overeen. Je doet er goed aan om deze termen in zowel Nederlands als Engels te leren gebruiken. 4
kijk voor een Engelse vertaling van Aristoteles categorieënleer op de volgende url: http://classics.mit.edu/Aristotle/categories.1.1.html 5
5
Over Objectoriëntatie zo voorts. Bij scheikunde leer je dat alles wat je ziet op te delen is in moleculen die bestaan uit een specifiek aantal basisbouwblokken, de atomen. Als je goed kijkt zie je overal een bepaalde systematiek, een vastgestelde hiërarchische indeling terug. Deze systematische indeling geeft ons ‘grip’ op de wereld om ons heen. We kunnen gemakkelijker praten over ingewikkelde zaken door afspraken te maken over de hiërarchische structuur. Hoe systematisch onze manier van indelen is, blijkt uit het succes van het ’20 questions principe’ waarmee in 20 vragen kan worden vastgesteld aan welk ding je denkt6. Het principe werkt als volgt: Stel je een verzameling voor waarin alle dingen vertegenwoordigd zijn, dit is de verzameling waar mee begonnen wordt. De ondervraagde neemt een ding in gedachten en beantwoord de 20 vragen naar waarheid. Door een vraag te stellen kunnen een heleboel dingen uitgesloten worden, als vraag 1 met ‘dier’ beantwoord wordt vallen alle dingen die geen dier zijn – bijvoorbeeld planten of koffiekopjes – af en wordt de groep met dingen die nog ‘meespelen’ een heel stuk kleiner. Door vervolgens naar kenmerken van de overgebleven verzameling te vragen kunnen steeds meer dingen weggestreept worden, net zo lang tot er nog maar één ding in de verzameling zit, meestal is dit het geval na het stellen van maximaal 20 vragen. Als dit het geval is stopt het spel en wordt verteld welk laatste ding er over is, vaak heeft het spel op dit punt geraden welk ding de ondervraagde in gedachten had. Problemen kunnen ontstaan wanneer verkeerde antwoorden gegeven worden, in plaats van de verzameling te verkleinen, vergroot dan de verzameling mogelijke dingen, het spel heeft dan meer vragen nodig om het betreffende ding te duiden. Het principe werkt enkel omdat wij alle dingen die we kennen opdelen in soorten en vervolgens rangschikken op basis van eigenschappen. Hieronder zijn de stappen van het 20 questions principe schematisch weergegeven.
Het 20 questions principe zie je ook terug in het Nederlandse gezelschapsspel ‘Wie is het’. Door vragen te stellen streep je mogelijke karakters weg en ontdek je langzaam het karakter dat je tegenstander uitgekozen heeft. Als er nog maar een mogelijkheid over is kan vastgesteld worden dat dit het gekozen karakter is en is het spel gewonnen en verloren. Een ander voorbeeld, stel je voor dat we geen systematisch systeem van indeling hebben maar enkel op basis van uiterlijke kenmerken kunnen beschrijven wat we bedoelen. Eigenlijk is dit een onmogelijke opgave, om überhaupt ook maar iets onder woorden te kunnen brengen heb je al taal nodig. Toch zal ik bij wijze van voorbeeld proberen zonder universele uitdrukkingen te gebruiken een situatie te beschrijven. Iemand legt binnen dit systeem van uiterlijke kenmerken uit hoe je sneller dan te voet kunt reizen: 6
als je dit wilt uitproberen kijk dan op http://www.20q.net/
6
Over Objectoriëntatie Het kan natuurlijk ook sneller dan de snelheid waarop wij ons voortbewegen, dan zult u echter gebruik moeten maken van een bepaald geval dat zich laat kenmerken doordat het zich voortbeweegt op vier van de dingen waar wij er maar twee van hebben, oh ja, er hangt aan de achterkant een heen en weer zwaaiend voorwerp aan. Het geval is zo’n drie keer groter dan ons en is in staat hoge snelheden te behalen. Hier kunt u in principe direct bovenop gaan zitten, het loont echter om een daartoe speciaal gemaakt ding op de bovenzijde van het geval te plaatsen, dat zit een stuk zachter. Ook is het handig om een constructie in de opening aan de voorzijde te plaatsen waarmee het geval een stuk beter te controleren is.
Het is gemakkelijker om de eerdergenoemde zaken aan te duiden als respectievelijk ‘paard’, ‘zadel’ en ‘tuig’, dan ontstaat er in ieder geval geen verwarring over wat we precies bedoelen.7 Zo is het nou ook in objectgeoriënteerd programmeren, omdat in het verleden gebleken is dat programmacode de eigenschap heeft al snel zeer verwarrend te worden, is besloten de taal overzichtelijk in te delen in objecten, dit scheelt programmeurs vele uren in het praten over code. Zelfs als een applicatie vele tienduizenden regels code beslaat blijft het toch nog mogelijk om op een heldere manier te communiceren omdat alle objecten van een bepaald type zijn en een heldere naam krijgen. In het zojuist gegeven voorbeeld is het door toevoeging van drie woorden direct helder waar het verhaal over gaat: Het kan natuurlijk ook sneller dan lopend, dan zult u echter gebruik moeten maken van een paard. Hier kunt u in principe direct bovenop gaan zitten, het loont echter om een zadel op de bovenzijde van het paard te plaatsen, dat zit een stuk zachter. Ook is het handig om een tuig te plaatsen waarmee het paard een stuk beter te controleren is.
Zo ontstaat er in ieder geval geen verwarring over het type beest waar op gereden kan worden. Het toevoegen van termen helpt!
Fundamenten van OOP programmeertalen Het hoogste hiërarchische niveau in een object-georiënteerde programmeertaal als Actionscript is het bibliotheek niveau.8 Alle dingen die je kunt gebruiken – in programmeurjargon spreken we over klassen – zijn in deze bibliotheek verzameld in een logisch hiërarchische indeling. De indeling heeft veel weg van de bestanden en mappen op je computer. Zo is het bestand waarin het document dat je nu leest staat, op mijn computer opgeslagen als ‘InleidingProgrammeren.docx’ de extensie 7
De afbeelding van de draak komt van: http://images.elfwood.com/art/d/t/dterner/dragon2.jpg
Gezien de eerder genoemde Engelse oriëntatie van programmeertalen wordt doorgaans de Engelse term ‘library’ gebruikt om naar de bibliotheek van Actionscript te verwijzen. 8
7
Over Objectoriëntatie ‘.docx’ betekent dat het een bestand is dat door Microsoft Word gebruikt wordt. Het bestand staat in de map ‘p10-11 Programmeren’ die zelf weer in de map ‘Interactieve Media’ in de map ‘Documenten’ staat. Deze indeling maak ik bewust zodat over tien jaar nog steeds teruggevonden kan worden wat in het betreffende jaar als onderwijsmateriaal gebruikt is. Doorgaans wordt de locatie van zo’n bestand een pad genoemd, paden worden als volgt weergegeven: Documenten/Interactieve Media/p10-11 Programmeren/InleidingProgrammeren.docx
Deze indeling komt je waarschijnlijk bekend voor en dit komt heel goed uit. De indeling van de Actionscript bibliotheek lijkt hier namelijk sprekend op, er is een vergelijkbare mappenstructuur met daarin de bestanden waar de objecten in beschreven staan. Bekijk het volgende voorbeeld waarin het pad naar het bestand voor het object Camera in de Actionscript bibliotheek weergegeven wordt. flash.media.Camera
Deze indeling geeft weer dat het bestand ‘Camera.as’ in de map media staat, die vervolgens weer in de map flash staat. De verschillen met de standaard manier waarop een map weergegeven wordt zijn 1) dat er punten worden gebruikt in plaats van slashes om de mappen en bestanden te scheiden en 2) dat er nooit een bestandsextensie wordt gebruikt omdat alle bestanden in de Actionscript bibliotheek automatisch moeten eindigen op ‘.as’. Zo een bestand dat eindigt op de extensie ‘.as’ noemen we een klassedefinitie of kortweg klasse. De klasse als blauwdruk voor objecten Een klasse definitie in Actionscript is een moeilijk voor te stellen iets, daarom worden er in het volgende gedeelte een aantal analogieën gegeven voor de klasse. Er wordt begonnen met de analyse van een begrip uit ons dagelijks taalgebruik, een voetbal. Deze analyse leidt tot een opsomming welke gebruikt kan worden om een ontwerp voor een voetbal te maken, een technische tekening. Een reproductie van technische tekening van een ontwerp noemt men een blauwdruk. De eigenschappen van de blauwdruk worden opgesomd en er wordt uitgelegd waarom een klasse in Actionscript lijkt op een blauwdruk. Daarna volgt een kort voorbeeld waarbij ik gebruik maak van de Nintendo Game Boy. Hierna dalen we rustig af naar het codeniveau, we gaan bekijken hoe het basisrecept voor een klasse in Actionscript er uit ziet. Als we een begrip wat we dagelijks hanteren analyseren dan doen we dat doorgaans door een opsomming te geven van alle eigenschappen. Laten we als voorbeeld eens naar een voetbal kijken: Officiële voetbal anno 1970: § moet rond zijn en deze vorm behouden § is gemaakt van leer (goedgekeurd materiaal) § heeft een diameter tussen de 69 en 71 cm § heeft een gewicht tussen de 400 en 450 gr
8
Over Objectoriëntatie § § § § §
is opgepompt tussen de 8.6 en de 15.7 psi heeft geen afwijkingen bij luchtstromen (!) is bestand zijn tegen ruwe behandeling is bruikbaar zijn bij slecht weer is zichtbaar bij slechte lichtomstandigheden
Dit lijkt een redelijk volledige opsomming van de eigenschappen van een voetbal.9 Iemand met een ballenproductiebedrijf zou op basis van dit lijstje een ontwerp kunnen maken voor een bal die aan deze voorschriften voldoet. We doen een gedachtenexperiment: Stel je een bedrijf van het oude stempel voor. Dit bedrijf is enige jaren na het ontstaan van de sport voetbal, omstreeks 1850, begonnen met het produceren van de bij dit spel benodigde materialen. Naast een hele reeks aan doelnetten, schoenen en scheenbeschermers zijn ze voornamelijk gespecialiseerd in officiële wedstrijdvoetballen. In de loop der jaren zijn vele honderden ballen geproduceerd. Het bedrijf heeft anno 1970 vestigingen over de hele wereld wat voor een sportbedrijf exceptioneel is te noemen. Omdat er een nieuwe standaard voor wedstrijdballen is aangenomen staat het bedrijf op het punt om een nieuw model in productie te nemen. Omdat elke vestiging dezelfde kwaliteitsvoetbal moet produceren is het noodzakelijk een gedegen ontwerp te maken en ervoor te zorgen dat iedereen dit ontwerp aanhoudt. De ontwerptekening wordt gereproduceerd zodat er voor elke vestiging een exemplaar is, de techniek die hiervoor gebruikt wordt is het maken van een blauwdruk. Door middel van deze film-reproductietechniek wordt de tekening gekopieerd naar meerdere blauwdrukken. Elke vestiging die zich aan de specificaties houdt kan op deze wijze hetzelfde type bal produceren. Laten we met dit verhaal in ons achterhoofd een tweetal vragen bekijken: Zou je zeggen dat elke bal die op basis van de blauwdruk geproduceerd wordt dezelfde bal is? Ik heb goede hoop dat deze vraag je ergens aan doet denken, deze vraag lijkt namelijk erg op het voorbeeld waarin een rechthoek twee maal het woord aardbei bevat wat je eerder in dit schrijven tegen bent gekomen. Als je op de vraag ‘ja’ antwoord dan denk je op het niveau van de klasse, elke bal is in dit opzicht van hetzelfde type. Antwoord je daarentegen ‘nee’ dan denk je op het niveau van instanties, elke bal is een uniek ding. Zou je zeggen dat de bal hetzelfde ding is als de blauwdruk voor de bal? Ik heb goede hoop dat je hier ‘nee’ op zult antwoorden. Als je toch ‘ja’ antwoord is het handig je voor te stellen als er zeg, een stuk of honderd voetballen op basis van de blauwdruk geproduceerd zijn en dat vervolgens de blauwdruk iets aangepast wordt. Veranderen de ballen dan mee, volgens mij niet. De ballen zijn weliswaar op basis van de blauwdruk gemaakt, ze zijn echter niet hetzelfde als de blauwdruk. Vanaf het moment dat de bal gemaakt is staat deze los van de blauwdruk. Om de precieze eigenschappen van de bal te onderzoeken kan je nog steeds naar de We vooronderstellen echter wel dat zaken als vorm, diameter, gewicht, oppompen, afwijkingen, ruw, slecht en zichtbaar al bekend zijn bij de persoon die dit lijstje leest en interpreteert. In onze dagelijkse taal gebruiken we erg vaak dit soort uitgebreide concepten die we als kind allemaal een keer hebben geleerd. Als je beseft hoe uitgebreid sommige van dit soort concepten zijn kan je afleiden dat het aanleren van een taal nogal wat voeten in de aarde heeft. 9
9
Over Objectoriëntatie blauwdruk kijken, deze geeft gedetailleerd weer hoe de bal was vlak na de productie. De slijtplekken die de bal door eventueel gebruik heeft staan hier echter niet op vermeld. Uit dit gedachtenexperiment heb je kunnen afleiden wat de eigenschappen van een blauwdruk precies zijn. 1. De blauwdruk kan gezien worden als constructieplan. 2. Een blauwdruk beschrijft de eigenschappen van het te produceren object, je kunt door bestuderen van een blauwdruk een voorstelling maken van het product wat op basis van de blauwdruk gemaakt kan worden. 3. Aan de hand van een blauwdruk kan een materiaallijst samengesteld worden, je kunt door systematisch alles na te lopen bepalen wat er benodigd is om het product te maken. Je zult je inmiddels afvragen waarom er zo’n uitgebreid verhaal over de blauwdruk gehouden wordt terwijl dit schrijven over programmeren gaat. Welnu, als je in Actionscript een programma schrijft dan doe je dat in een zogenaamde klasse. Deze klasse bevat een complete beschrijving in programmeercodes van het type object wat op basis van de klasse gemaakt kan worden. Alle eigenschappen van het object staan in de klasse vastgelegd, hierbij kan je denken aan zaken als de kleur en de hoogte of breedte van het object. Naast eigenschappen staan ook alle functies van het object vastgelegd, zo kan bijvoorbeeld vastgelegd zijn wat er gebeurt als er op het object geklikt wordt. Als een programma uitgevoerd wordt dan worden op basis van zo’n klasse objecten aangemaakt. Stel je voor dat we een klasse hebben die de naam ‘bal’ heeft waarin de eigenschappen voor een rode bal van 100 x 100 pixels staat vastgelegd, omdat dit een heel eenvoudige klasse is zijn er verder geen functies. We kunnen een programma schrijven wat 100 van deze ballen produceert en op het scherm zet. Er hoeft maar één klasse bal te zijn om oneindig veel objecten van het type bal aan te maken. Zie je hoe deze klasse lijkt op de blauwdruk uit het vorige voorbeeld? Een klasse lijkt op een blauwdruk omdat ze beiden 1) een beschrijving geven voor de constructie van objecten, 2) een compleet overzicht bieden van de eigenschappen van een object en 3) als een soort boodschappenlijstje gezien kunnen worden. Voordat we naar echte programmacode gaan kijken nog een laatste voorbeeld. Ik heb goede hoop te mogen geloven dat iedereen die dit stuk leest weet wat een Nintendo Game Boy is. Bekijk de volgende twee afbeeldingen:
10
Over Objectoriëntatie De Game Boy aan de linkerkant is de originele versie. Deze is gemaakt op basis van het ontwerp zoals dat bij Nintendo gemaakt is. Op basis van dit ontwerp zijn ongeveer 118 miljoen apparaten gemaakt. De Game Boy aan de rechterkant is een zogenaamde ‘mod’ die is uitgevoerd door een steampunkfanaat. Deze persoon heeft een originele Game Boy aangepast door mechanisch uitziende onderdelen toe te voegen. Het resultaat, de mod, werkt op dezelfde wijze als het origineel maar ziet er totaal anders uit. Bekijk met deze twee objecten, de originele Game Boy en de mod, de volgende twee vragen: 1. Wordt een ontwerp aangepast als een object veranderd? 2. Wordt een object aangepast als het ontwerp veranderd? Als er aanpassingen aan een object plaatsvinden, moet dan ook het ontwerp aangepast worden? Natuurlijk niet, het zou nogal wat voeten in de aarde hebben als Nintendo bij elke aanpassing die een gebruiker aan zijn gekochte apparaat maakt alle ontwerpen op de schop zou moeten nemen. Als een apparaat eenmaal geproduceerd is kan het aangepast worden zonder dat het ontwerp aangepast hoeft te worden. Er zijn natuurlijk gevallen denkbaar waarin dit wel gebeurd, stel dat Apple een probleem constateert en besluit dat een bepaalde functie van de iPhone anders uitgevoerd moet worden, en er wordt een prototype aanpassing uitgevoerd op een apparaat. Dan kan, als de aanpassing het geconstateerde probleem verhelpt, besloten worden het ontwerp aan te passen. Hoe zit het met de tweede vraag, wordt een object aangepast op het moment dat het ontwerp verander? Ook in dit geval moeten we ‘nee’ antwoorden. Het zou nogal wat zijn als alle apparaten zouden veranderen zodra Nintendo aan het ontwerp zit. Je zou in dat geval nooit meer een nieuw apparaat hoeven aanschaffen omdat het mee veranderd! Je zou een prototype kunnen kopen wat automagisch geüpgraded wordt zodra het ontwerp aangepast wordt. Nee, het aanpassen van een ontwerp heeft wat meer voeten in de aarde. Toen Toyota merkte dat er in het remsysteem van de Prius een foutje zat moesten alle voertuigen teruggeroepen worden zodat de aanpassing doorgevoerd kon worden. Welnu, een klasse in Actionscript heeft veel weg van een blauwdruk. Op basis van een klasse maak je objecten aan, de blauwdruk kan dus gezien worden als constructieplan voor een object. Ook beschrijft een klasse de eigenschappen van het te produceren object, als je een klasse leest kan je een voorstelling hebben van hoe het object er uit komt te zien. Tenslotte kan je in een klasse aflezen welke zaken benodigd zijn om het 11
Over Objectoriëntatie object te maken. Dit zijn exact de eigenschappen van de blauwdruk zoals we die eerder beschreven hebben! Hoe ziet zo’n klasse er precies uit? Het is hoog tijd dat we naar een stukje code gaan kijken. Net als het basisrecept voor een XHTML-pagina dat jullie bij het vak Internetstandaarden zijn tegengekomen is er voor een klasse in Actionscript ook een basisrecept, doorgaans wordt dit raamwerk-code of in het Engels skeleton-code genoemd. Omdat jullie gebruik maken van Adobe Flash Builder wordt deze raamwerk-code automagisch voor je aangemaakt. Grofweg kan een klasse ingedeeld worden in drie gedeelten, deze indeling is altijd hetzelfde, anders ontstaan er foutmeldingen. Deze grove indeling zie je in het schema hieronder. Merk op dat er een soort nest-structuur is, je kunt dit vergelijken met het ‘nesten’ van HTML tags. De buitenste laag bevat de locatie van de klasse in de mappenstructuur van jouw project. Vervolgens de benodigdheden, de afhankelijkheden van de klasse.10 Zie afhankelijkheid als volgt, als je een spijker in een plank wilt slaan dan heb je tenminste i) een plank, ii) een spijker en iii) een hamer nodig. In een Actionscript klasse moeten deze zaken als een soort boodschappenlijstje opgesomd worden om er zeker van te zijn dat we niets missen. Na de afhankelijkheden wordt vastgelegd hoe de betreffende klasse heet. Deze naam moet overeenkomen met de naam van het bestand. Als het bestand ‘RodeBal.as’ heet, dan moet de klasse automagisch ook de naam RodeBal dragen. Deze eerste twee niveau’s kan je vergelijken met het HTML … element. Tenslotte worden de eigenschappen en methoden van de klasse vastgelegd, dit derde niveau is te vergelijken met het HTML … element alhoewel er in een Actionscript klasse veel meer gebeurt dan het opmaken die je gewend bent uit HTML. Hieronder een voorbeeld van deze raamwerk-code. Bestand: RaamwerkCode.as
package { import flash.display.Sprite; public class RaamwerkCode extends Sprite { public function RaamwerkCode() { }
10
Deze benodigdheden of afhankelijkheden heten in het Engels ‘dependencies’
12
Over Objectoriëntatie } }
Er zijn in deze code drie niveaus te herkennen. Het buitenste niveau is dat van de package: package { … }
Achter het woord package staat het pad naar het .as bestand. Dit houdt in dat je hieraan kunt aflezen in welke map op de harde schijf het bestand hoort te staan. Packages bieden een manier om de vele klassen die je in een groot programma maakt te kunnen groeperen op soort. Zoals we eerder gezien hebben geef je de mappen in juiste volgorde weer door deze te scheiden met een punt. Een map met de naam ‘dieren’ in de map ‘iam’ in de map ‘hva’ in de map ‘nl’ geef je in Actionscript weer als ‘nl.hva.iam.dieren’. Hierin zie je meteen de conventie11 van het gebruiken van de omgekeerde url. Door deze methode te hanteren blijft je eigen code-bibliotheek op orde. Gebruik de url van het project waar je aan werkt dan lopen de zaken nooit door elkaar en kan je oude code gemakkelijk terugvinden. Standaard staan je bestanden in de hoofdmap van je programmeerprojectje, in dat geval is er geen mappenstructuur om aan te geven en wordt deze weggelaten. Op tweede niveau wordt een boodschappenlijstje opgesomd. Je kunt aan de import opdracht zien dat er zaken van buiten het bestand wordt aangeroepen. Ook wordt op dit niveau de naam en het type van de klasse aangeduid: … import flash.display.Sprite; public class RaamwerkCode extends Sprite { … } …
Bij de import opdrachten gebruik je dezelfde puntnotatie als bij de package. Je ziet in het voorbeeld hierboven dat het bestand Sprite.as uit de package flash.display wordt geïmporteerd, dit is een standaard klasse uit de Actionscript library en bevat een soort basis voor classes die je zelf aanmaakt. Een regel verder zie je dat de klasse benoemd wordt. De naam RaamwerkCode is zelf gekozen, je mag je klassen in Actionscript zelf een naam geven. Hier zie je meteen de tweede conventie, doorgaans worden klassen met een hoofdletter aangeduid. Dit is wederom niet
Een conventie is een soort afspraak, het is niet verplicht je hieraan te houden maar in de praktijk wordt eigenlijk nooit van deze afspraak afgeweken. 11
13
Over Objectoriëntatie verplicht maar is wel erg handig. Als iets een hoofdletter heeft weet je automatisch dat het om een klasse gaat! Het woord extends geeft aan dat deze klasse een uitbreiding is op de Sprite klasse. De Sprite biedt een groot aantal standaardinstellingen en wordt eigenlijk altijd op deze manier gebruikt. Het derde niveau is het niveau van eigenschappen en methoden. Eigenschappen worden opgeslagen in variabelen en methoden worden opgeslagen in functies. In het voorbeeld zie je nog geen eigenschappen staan, er staat wel een methode en direct een hele speciale:
… public function RaamwerkCode() { } …
Wellicht is je opgevallen dat deze functie exact dezelfde naam draagt als de klasse. Dit geeft aan dat deze automatisch wordt uitgevoerd als er een object op basis van deze klasse wordt aangemaakt. Omdat deze functie bijna altijd programmeeropdrachten bevat die zorg dragen voor de constructie van het object, het opbouwen van het object, draagt deze functie nog een speciale aanduiding. Deze functie wordt de constructor genoemd en is in een klasse de enige functie die qua naamgeving begint met een hoofdletter. Alle andere functies beginnen met een kleine letter, opnieuw is dit een zogenaamde conventie. Methoden zijn voor onze wijze van programmeren zo belangrijk dat deze wel wat extra aandacht mogen krijgen. Methoden Zoals in het hoorcollege is gezegd is er geen verschil tussen functies en methoden. Het zijn twee woorden die hetzelfde principe aanduiden. Een methode is een manier om een aantal programmeeropdrachten te groeperen zodat deze makkelijk herhaaldelijk aangeroepen kan worden. Ik zal proberen een helder voorbeeld te geven. Stel dat we een rc-auto12 hebben waarbij een aantal dingen gebeuren zodra je naar voren rijd. De zaken die tegelijk gebeuren zijn: 1. De motor gaat naar voren draaien 2. De verlichting in de cabine gaat aan 3. Er klinkt een grommend motorgeluid uit een luidspreker Het zou erg vervelend zijn als je op je afstandsbediening elke keer drie knopjes tegelijk in moet drukken. Daarom zitten deze drie gekoppeld aan één pookje waarmee je door vooruit te bewegen alle drie de zaken kunt laten gebeuren. Ditzelfde principe pas je toe door een serie opdrachten in een functie te groeperen. Een functie in Actionscript herken je aan een werkwoord (=conventie) 12
rc-auto staat voor remote controlled auto, een op afstand bestuurbare auto.
14
Over Objectoriëntatie en de ronde haakjes. Op de volgende pagina vind je een voorbeeld: … public function vooruitRijden() { kabineVerlichting = true; hoofdMotor.draaiVooruit(); grommendMotorGeluid.play(); } …
Wat wellicht opvalt is dat binnen deze functie vooruitRijden( ) opnieuw twee functies worden aangeroepen. Dat is heel gebruikelijk, een volgende conventie luid dat een functie beknopt moet zijn. Je kunt je wellicht voorstellen dat om de motor van onze rc-auto vooruit te laten draaien een aantal electronische handelingen uitgevoerd moeten worden. Deze kunnen opnieuw gegroepeerd worden in een functie. Op deze wijze trek je de code ‘uit elkaar’ om het geheel voor jezelf overzichtelijk te maken. Het bedenken van de meest nette structuur voor de functies van jouw programma heeft nogal wat voeten in de aarde. Gelukkig krijg je van Adobe een hele bibliotheek met standaard klassen welke je zo kunt gebruiken. Voor een programma hoef je dus niet alles zelf te programmeren maar kun je gebruik maken van de standaard klassen. In de tweede werkgroep krijg je een overzicht van veelgebruikte klassen en de functies die in deze klasse gebruikt kunnen worden. De methoden op een standaard klasse kan je, als je daar behoefte aan hebt, aanpassen naar je eigen smaak. Om het voorbeeld aan te houden, stel dat je je rcauto wilt aanpassen en er miniatuur helly schijnwerpers op wilt monteren die met het rijden ook aangezet worden. Je kunt dan een functie overschrijven met je eigen functie. Dit principe heet override en is een erg moeilijk principe waar we in ons vak waarschijnlijk niet aan toe komen. De bovenste regel in de gegeven voorbeeldcode: kabineVerlichting = true; maakt geen gebruik van een methode maar van een eigenschap. Net als methoden zijn ook eigenschappen het waard om even apart onder de loep te nemen. Eigenschappen In het hoorcollege heb je gehoord dat zowel het woord eigenschap als het woord variabele dezelfde zaak aanduid. Een eigenschap is onderdeel van een klasse, maar een eigenschap is eigenlijk niet meer dan een naam welke verwijst naar een ding van een bepaalde soort (ook een klasse). Net als bij de methoden zijn ook veel standaard eigenschappen aanwezig in de Actionscript bibliotheek. Om het principe van variabelen toe te lichten gebruik ik het volgende voorbeeld. … import flash.display.Sprite;
15
Over Objectoriëntatie public class Auto extends Sprite { public var kabineVerlichting:Boolean; public var bandenspanning:Number; public var maximumSnelheid:Number; public var benzineverbruik:Number; public var productieDatum:Date; … } …
Hier zie je op de daartoe bestemde plaats, net na de naamgeving van de klasse, een opsomming van een vijftal eigenschappen. Je herkent een eigenschap een het woord var wat een verkorte manier is van schrijven van het woord variabele. Elke variabele heeft een datatype, is van een bepaalde soort. Je ziet achter de dubbele punt ‘:’, welke staat voor ‘van het type’, het datatype van de variabelen staan. In het voorbeeld staat dus een variabele productieDatum van het type Date. Merk op dat alle datatypen beginnen met een hoofdletter! Wat betekende dit ook alweer? Er is een conventie dat alle namen voor klassen met een hoofdletter geschreven worden. De datatypen zijn zelf dus ook beschreven in een klasse! De eigenschappen van een klasse zijn dus verwijzingen naar objecten van een andere klasse! In het gebruikte voorbeeld van de voetbal kan je je wellicht een klasse Voetbal voorstellen waarin een variabele ‘luchtdruk’ bestaat waarin de luchtdruk bijgehouden wordt. Deze variabele is van het datatype Number, de Number staat zelf ook weer in een klasse, deze staat in het bestand Number.as beschreven. Dit is een erg lastig principe, het is nog het makkelijkst te onthouden als: Alles in een Actionscript programma is een object wat gemaakt is op basis van een klasse! Nou zie je dus waarom er wordt gesproken over object georiënteerd programmeren! Overzicht Met name het laatste stuk over methoden en eigenschappen ging erg snel. Het is niet erg als je dit niet in een keer begrijpt, hier wordt in de lessen veel aandacht aan besteed. Je hebt nu enigszins een basis om te beginnen met lezen in het boek ‘Actionscript 3.0 Animation; Making things move’. Om een aantal bijzondere tekens in de taal te benadrukken heb ik op de volgende pagina’s een uitleg over de syntaxis van Actionscript opgenomen. Kijk deze eens rustig door. Eventueel kan je dit gebruiken als snel naslagwerk als je een teken niet kunt plaatsen. Ik besef me terdege dat dit schrijven verre van volledig is, het betreft een levend document wat in de loop van de jaren aangevuld zal worden en hopelijk elk jaar
16
Over Objectoriëntatie een stukje beter wordt. Als je suggesties hebt voor zaken die behandeld zouden moeten worden sta ik open voor suggesties. Laat me dit weten via email
[email protected] of spreek me persoonlijk aan in de wandelgang of na een college.
17
Over Objectoriëntatie
Syntaxis, de grammatica van programmeertalen Zoals gezegd is het lezen van code noodzakelijk bij het leren programmeren. Om die code te kunnen lezen moet worden uitgelegd uit welke tekens een taal in basis bestaat en waar deze voor dienen. Opnieuw kunnen we als voorbeeld terugspringen naar HTML waarin de tekens <, >, /, =, “,” en daarnaast een hoop sleutelwoorden als title, id, class, enzovoorts gebruikt worden. We hebben in het vak Internetstandaarden ook CSS gezien waarin weer andere tekens, namelijk #, . , {, } en daarnaast sleutelwoorden als width, height, background-color, enzovoorts betekenis hebben. Deze tekens, sleutelwoorden en regels waaruit een taal bestaat wordt de syntaxis genoemd.13 De syntaxis van de taal Actionscript 3.0 is als volgt:14 Hoofdlettergevoeligheid Actionscript is een hoofdlettergevoelige taal.15 Aanduidingen die maar een hoofdletter van elkaar verschillen zijn in Actionscript dus absoluut verschillend. Bekijk het volgende voorbeeld: var getaleen:int; var getalEen:int;
In het voorbeeld worden twee variabelen aangemaakt, wat dit precies zijn behandelen we later nog. De variabelen krijgen achtereenvolgens de naam ‘getaleen’ en ‘getalEen’, voor Actionscript zijn dit twee absoluut gescheiden dingen. Puntnotatie Door middel van de punt kunnen de eigenschappen en methoden van een object door middel van een instantienaam aangesproken worden. Om dit te doen schrijf je eerst de instantienaam, vervolgens de punt en tenslotte de functie of eigenschap die je wilt aanspreken. Neem de volgende klassedefinitie: class PuntVoorbeeld { public var eigenschap1:String;
public function methode1():void { }
13
De Engelse vertaling van syntaxis is makkelijker, ‘syntax’
Voor het samenstellen van het overzicht van de syntaxis is de structuur gebruikt zoals weergegeven op http://help.adobe.com/nl_NL/ActionScript/3.0_ProgrammingAS3/ (bezocht op 2 september 2010) 14
15
De Engelse vertaling van hoofdlettergevoelig is ‘case sensitive’
18
Over Objectoriëntatie }
Met behulp van de puntnotatie kunnen de eigenschap ‘punt1’ en de functie ‘puntFunctie’ aangesproken worden zoals in het volgende voorbeeld: var puntvb:PuntVoorbeeld = new PuntVoorbeeld(); puntvb.eigenschap1 = “Hallo wereld!”; puntvb.methode1();
Daarnaast worden zoals eerder uitgelegd de paden naar klassedefinities in de Actionscript bibliotheek ook met de puntnotatie aangegeven. Hieronder een verwijzing naar de klasse ‘MouseEvent’ in de map ‘events’ in de map ‘flash’ en een verwijzing naar de klasse ‘Sprite’ in de map ‘display’ in de map ‘flash’. flash.events.MouseEvent flash.display.Sprite
Letterlijke tekens Met letterlijke tekens worden tekens bedoeld die een directe betekenis dragen, ze verwijzen dus niet naar een waarde zoals variabelen dat doen maar zijn hun eigen waarde, ze zijn letterlijk. Hieronder een opsomming letterlijke tekens: 42 “Hallo” -6 5,8 null undefined true false
Letterlijke tekens kunnen gegroepeerd worden om samengestelde letterlijke tekens te vormen. Rijen of arrays met letterlijke tekens worden ingesloten door blokhaken
19
Over Objectoriëntatie [ ] en gebruiken komma’s om elementen te scheiden.16 In het volgende voorbeeld worden twee arrays getoond die zijn aangemaakt door middel van de notatie met blokhaken. Let op, dit is niet de enige manier om een array aan te maken! var woordenRij:Array = [“aap”, “noot”, “mies”, “wim”, “zus”, “jet”]; var getallenRij:Array = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 146];
Naast de array kunnen verschillende letterlijke tekens ook gegroepeerd worden in een object. In plaats van blokhaken worden dan accolades { }gebruikt. Hieronder wordt een object kleuren gemaakt met drie eigenschappen, rood, groen en blauw: var kleuren:Object = {rood:0xff0000, groen:0x00ff00, blauw:0x0000ff};
Puntkomma De puntkomma wordt in Actionscript gebruikt om een instructie te beëindigen. Misschien is je in de eerdere codevoorbeelden al opgevallen dat nagenoeg elke regel eindigt met een puntkomma. Als je een heleboel instructies tegelijk geeft snapt de computer het niet meer, met behulp van de puntkomma kan je aangeven welk stuk code bij welke instructie hoort. Een voordeel van dit gebruik van puntkomma’s is dat je code ook voor ons mensen een stuk beter leesbaar wordt. Ronde haakjes Rondje haakjes worden in Actionscript op verschillende manieren toegepast. Allereerst worden ronde haakjes gebruikt om een of meer parameters door te geven aan functies of methoden. In het voorbeeld wordt de tekenreeks “Hallo wereld!” doorgegeven aan de functie ‘trace’. trace(“Hallo wereld!”);
De tweede manier waarop ronde haakjes toegepast worden lijkt op wat je gewend bent als je op de middelbare school wiskunde hebt gehad. Je kunt met haakjes invloed uitoefenen op de volgorde waarop bepaalde berekeningen worden uitgevoerd. In het voorbeeld zie je twee berekeningen die naar de functie ‘trace’ worden doorgestuurd. trace(2+3*4);
// geeft 14
trace((2+3)*4) // geeft 20
De Engelse vertaling van rijen is ‘arrays’ in de tekst zal verder deze Engelse vertaling gebruikt worden omdat de klassedefinitie ook Array heet. 16
20
Over Objectoriëntatie
Commentaar In Actionscript worden twee soorten commentaar toegepast: commentaar bestaande uit een enkele regel enerzijds en commentaar van meerdere regels anderzijds. Commentaar bestaande uit een enkele regel begint met twee slashes (//) waarachter tot het eind van de regel commentaar geschreven kan worden. var foo:int = 25; // Een regel commentaar
Commentaar van meerdere regels wordt ingesloten tussen slash + sterretje (/*) en sterretje + slash (*/). Alles wat tussen deze tekens in staat wordt door Actionscript gezien als commentaar. Deze vorm van commentaar wordt vaak gebruikt om stukjes code aan of uit te zetten. Hieronder een voorbeeld. /* Een stuk commentaar dat over meerdere regels doorloopt kan op deze wijze aangegeven worden */
Sleutelwoorden Er is een redelijk grote hoeveelheid woorden met een speciale betekenis in Actionscript, deze woorden mogen niet gebruikt worden als bijvoorbeeld variabele-, of classnaam. Als je script raar reageert en je hebt echt ALLES gecontroleerd, kijk dan ook nog even door deze lijst om zeker te stellen dat je niet een van de sleutelwoorden verkeerd probeert te gebruiken. De sleutelwoorden zijn: as, break, case, catch, class, const, continue, default, delete, do, else, extends, false, finally, for, function, if, implements, import, in, instanceof, interface, internal, is, native, new, null, package, private, protected, public, return, super, switch, this, throw, to, true, try, typeof, use, var, void, while, with each, get, set, namespace, include, dynamic, final, native, override, static, abstract, boolean, byte, cast, char, debugger, double, enum, export, float, goto, intrinsic, long, prototype, short, synchronized, throws, to, transient, type, virtual, volatile
21