PDA

Volledige versie bekijken : [AS 2.0] Wat is AS 2.0 en wat zijn Datatypes?


Dauntless
%Europe/Berlin %671 %2005, 16:07
Hier het eerste deel van onze tutorial:

1. Wat is AS 2.0 en waar gebruik je het voor?

AS 2.0 is een programmeertaal. Het is de opvolger van het alom bekende AS 1.0. Je kan deze nieuwe versie van ActionScript gebruiken vanaf Flash MX 2004. Ok, dat is duidelijk, maar wat kunnen we er mee?

Wel, met AS 2.0 kan je je eigen classes schrijven (komt later aan bod). Het geeft je ook meer controle over je applicatie en vooral tijdens het debuggen zijn classes erg handig. Maar niet alleen tijdens het debuggen is het handig. Doordat je met AS 2.0 werkt, moet je gaan nadenken hoe je classes eruit gaan zien, welke taak een classe op zich gaat nemen en hoe classes met elkaar samen gaan werken. (Dit komt nog uitvoerig aan bod) Doordat je zoveel moet nadenken over de structuur van je applicatie, werk je gestructureerder aan je applicatie en zijn fouten makkelijker te achterhalen en te verbeteren. Ook geeft AS 2.0 je de mogelijkheid om modulair te werken. Kort gezegd houd dit in dat je aparte “bouwstenen” (de classes) maakt die ieder een taak op zich nemen. Ieder afzonderlijk stukje is dus niet specifiek gemaakt voor je applicatie. Je kan vaak eerder gemaakte classes hergebruiken. Dit is een groot voordeel van AS 2.0.
Een ander voordeel van AS 2.0 is dat wanneer je een variabele naam verkeerd typt, de flash compiler zegt dat hij een variabele gevonden heeft die niet bestaat. Een ander groot voordeel is dat je kan zeggen van welke soort een bepaalde variabele is. Dat kan door middel van .... Datatypes!

2. Datatypes

Datatypes zorgen er voor dat een variabele van een bepaald type is. Zo heb je bijvoorbeeld de datatypes MovieClip, Array, String, Number, MovieClipLoader, LoadVars, XML, XMLNode, en nog vele anderen!
Het voordeel hiervan is weer te merken tijdens het debuggen van je applicatie. Stel dat je een variabele aangemaakt hebt van het type 'String' en op een bepaald moment probeer je er een getal aan toe te voegen. Dan gaat de flash compiler een error geven:

**Error** Scene=Scene 1, layer=Layer 1, frame=1:Line 2: Type mismatch in assignment statement: found Number where String is required.
myVar = 5;

Total ActionScript Errors: 1 Reported Errors: 1

Dan weet je dat je iets fout getypt hebt, of dat je niet goed nagedacht hebt over de structuur van je applicatie.

Het toekennen van een datatype is heel simpel. In Flash komt het datatype achter de variabele. Dit heet de 'post-colon syntax'.
Een voorbeeld:
var myVar:String;

Nu heb je een variabele aangemaakt van het type 'String' (zonder waarde).

Maar wat als je nu een waarde van een ander type wil toekenen? Bijvoorbeeld: Je laat de user een nummer ingeven in een textbox. De property 'txtVak.text' is een String, maar je wil een Number!

var leeftijd:Number = txtVak.text;

Dit levert een fout op omdat txtVak.text een String is, geen Number. Hoe kan je dit oplossen? Door type casting. Dit heb je waarschijnlijk al wel veel gedaan zonder dat je het wist. Een variabele casten betekent dat je zijn datatype verandert. Het casten werkt zo: var varnaam:Type1 = Type1(Type2);

Om de String uit het tekstvak om te zetten naar een Number doen we het volgende:

var leeftijd:Number = Number(txtVak.text);

Het is niet mogelijk om een variabele van type te veranderen. Maar... Er zijn wel achterdeurtjes ;).

In ActionScript is elke (standaard) classe een subclasse van de classe 'Object'. Dus, wat als we nu een variabele het type 'Object' geven?
var leeftijd:Object = txtVak.text
Dit geeft geen error, omdat String een subclasse is van de classe Object.
De String wordt aan de variabele 'leeftijd' toegekend en de waarde blijft een String.
var leeftijd:Object = txtVak.text
trace("Het type van leeftijd = "+typeof(leeftijd));
//output:
//Het type van leeftijd = string


Een andere manier is door het gebruik van associative array referencing. Associative array referencing is een lange term voor een eenvoudig gebruik. Het is niet echt een achterdeurtje maar eerder een bug. Het Object type gebruiken is perfect legaal, maar wat je nu gaat zien is best vreemd.

Associative array referencing wordt als volgt gebruikt: tijdlijn[var1] = var2; (tijdlijn kan ook een object zijn).
Bijvoorbeeld:
var leeftijd:Number = 16;
this["leeftijd"] = "Dauntless";

Dit geeft géén foutmelding. Op zich is het ook tot op zekere hoogte logisch. De flash compiler kan op voorhand nog niet weten wat voor waarde er tussen de [vierkante haken] komt.
Vergeet niet: Je kan het type van een variabele NIET veranderen! Het type van de 'leeftijd' variabele is immers nog altijd Number!
var leeftijd:Number = 16;
this["leeftijd"] = "Dauntless";
trace(typeof(leeftijd));
this.leeftijd = 10;
trace(typeof(leeftijd));
Hieruit kan je afleiden dat na de tweede toekenning de waarde van de variabele een String is, maar dat het type nog altijd Number is (we krijgen immers geen error bij de derde toekenning). De variabele zelf blijft dus van het type Number, terwijl de waarde van de variabele verandert van Number naar String naar Number. Nu begrijp je denk ik wel dat dit een bug is ?

Nog een laaste opmerking (Dankzij TheDutch):
Je kan een datatype alleen toekennen als je een variabele declareert in de huidige tijdlijn. Een declaratie van een variabele met een datatype moet dus altijd van de vorm:
var varNaam:Datatypezijn.

Je kan dus geen datatype toekennen aan een variabele die je in een ander Object (of MovieClip) aanmaakt.

var ob:Object = new Object();
ob.naam:String = "Dauntless";
Deze code levert namelijk een syntax error op.

Dit was de inleiding AS 2.0. Het is nog kort, maar dit is ook wel een essentiële basis. Als je geen gebruik maakt van datatypes, gebruik je een van de grootste voordelen van AS 2.0 niet. Ik hoop dat het duidelijk was (de meeste dingen kende je misschien al) en dat jullie vol ongeduld op de volgende wachten? ;)

-Roenes en Dauntless

pulletje
%Europe/Berlin %676 %2005, 16:13
Dat hebben jullie mooi gemaakt! Ga zo door...

Cowerd
%Europe/Berlin %683 %2005, 16:23
Goed artikel!:D

Flasher
%Europe/Berlin %736 %2005, 17:40
Goed verhaal [^]
Toch 1 klein dingetje: (klok/klepel[?])
Dit heet de 'post-column syntax'.Je bedoelde waarschijnlijk de post-colon syntax

Verder helemaal top 8D

Dauntless
%Europe/Berlin %743 %2005, 17:50
'k Was aan het twijfelen ... En ik had het idd moeten opzoeken :#.

Roenes
%Europe/Berlin %747 %2005, 17:55
Daarom leek het dus zo vreemd :P ik dacht dat het aan mij lag toen ik het las :p Toch goed dat je zo kritisch kijkt! :)

TheDutch
%Europe/Berlin %769 %2005, 18:28
Goed artikel jongens! Duidelijk uitgelegd en zeker leerzaam voor mensen die AS 2.0 willen leren. Probeer alleen wel bij één taal te blijven wanneer je dingen uitlegt. Classe is Nederlands maar subclass is weer Engels. Probeer daar consequent in te blijven. :).

Als laatste wil ik nog even opmerken dat jullie naar mijn idee twee dingen vergeten zijn. Data typing voor variabele en objecten binnen alreeds bestaande objecten kan niet. Bijvoorbeeld:

myMC.var1:String
// of
var myMC.var1:String

Verder denk ik dat jullie functies vergeten zijn. Functies kunnen een "return type" hebben en alle argumenten kunnen ook een "data type" hebben. Ik denk dat jullie dat weg hebben geladen omdat jullie dat aan de orde willen stellen wanneer jullie een artikel schrijven over classen. Echter kunnen functies ook - bij procedureel programmeren - buiten classen worden gebruikt en zouden eigenlijk in dit artikel al aan de orde moeten komen. Misschien is het goed om die beide nog toe te voegen? ;)

Zoals ik al zei, een top eerste artikel!

Erwin

Dauntless
%Europe/Berlin %774 %2005, 18:35
We zijn idd van plan om bij classes en return types het eerst in AS 1.0 te bespreken.

Dat eerste punt heb je helemaal gelijk! Dat ga ik er dan ook bijzetten :). Het andere komt dan dus bij 'classes.

En dat van de taal is natuurlijk ook juist. We proberen er op te letten :).

Fatty Owl
%Europe/Berlin %775 %2005, 18:36
waarom is dit geen sticky? :)

Dauntless
%Europe/Berlin %778 %2005, 18:41
Omdat we dan op het einde met 10 stickies zitten... Nu is er 1 sticky met links naar de verschillende topics :).

TheDutch
%Europe/Berlin %781 %2005, 18:45
Dauntless, top dat je het zo snel erbij hebt gezet...alleen er is volgensmij wat misgegaan :).

Roenes
%Europe/Berlin %783 %2005, 18:47
Dauntless, top dat je het zo snel erbij hebt gezet...alleen er is volgensmij wat misgegaan :).En dat is nu bijgewerkt. :)

Ook nog bedankt voor de aanvullingen/opmerkingen. Als je die in andere stukken ook tegenkomt, blijf ze melden. Dat verbeterd de kwaliteit van het verhaal alleen maar :)

TheDutch
%Europe/Berlin %784 %2005, 18:49
Dank je! Tuurlijk blijf ik jullie stukken lezen en geef waar nodig wat feedback :).

Emveedee
%Europe/Berlin %692 %2006, 16:37
Ziet er mooi uit, maar ik snap er geen zak van :P
Nog n paar keer goed doorlezen dan maar ;)

Btw:
Ik zie het nut niet echt in van datatypes..
Waarom zou je je variabele in een bepaalde class duwen?
En: Als je je var's geen datatype toekent, werkt je script dan ook of krijg je errors?

matzo
%Europe/Berlin %695 %2006, 16:42
bij globals kan datatyping overgens ook niet. Of zijn globals deprecated?

TheDutch
%Europe/Berlin %703 %2006, 16:53
bij globals kan datatyping overgens ook niet. Of zijn globals deprecated?
Is niet alleen bij globals, maar altijd bij het aanmaken van een object of variable binnen een bestaand object op deze manier:

var object.var1:String = "test";

of op deze manier:

object.var1:String = "test";

Vanaf AS 3.0 kan dit trouwens wel. Globals is niet deprecated in Flash 8 maar bestaat niet meer in AS 3.0 :).

TheDutch
%Europe/Berlin %706 %2006, 16:56
Ziet er mooi uit, maar ik snap er geen zak van :P
Nog n paar keer goed doorlezen dan maar ;)

Btw:
Ik zie het nut niet echt in van datatypes..
Waarom zou je je variabele in een bepaalde class duwen?
En: Als je je var's geen datatype toekent, werkt je script dan ook of krijg je errors?
Lees het inderdaad nog maar eens goed door ;).

Flasher
%Europe/Berlin %795 %2006, 19:04
var leeftijd:Number = 16;
this["leeftijd"] = "Dauntless"; ====>BUG ???
trace(typeof(leeftijd));
this.leeftijd = 10;
trace(typeof(leeftijd));
Om te begrijpen waarom this["leeftijd"] = "Dauntless" geen error oplevert moet je begrijpen hoe de compiler werkt. In principe maakt hij nl. van AS2 -> AS1. Alle classes worden omgezet in AS1 "classes" (prototype gedoe)
De dataTypes worden gebruikt voor type-checking. Daarbij zoekt de compiler alle fouten die hij op dat moment kan vinden, en die toont hij. De datatypes zelf worden niet gecompiled. De types die je met typeof() bekijkt, hebben dus helemaal niets te maken met wat er als datatype gespecificeerd is, omdat de typeof functie dat helemaal niet weet.

Daarom denk ik dat je het niet zozeer moet zien als een bug, maar als iets wat nou eenmaal zo werkt. Datatyping is heel handig voor het debuggen en als je op deze manier de compiler probeert te omzeilen snijd je uiteindelijk alleen jezelf in de vingers.

Dauntless
%Europe/Berlin %818 %2006, 19:38
Lijkt me een verschil van interpretatie. Ik bekijk het als een bug omdat hij geen fout geeft. Dan komt dat idd doordat alles wordt herleidt naar pure as 1.0, maar dan vraag ik me af: als je AS 2.0 in het leven roept, waarom dan alles terug omzetten naar 1.0 bij het compilen? Dan lijkt het mij logischer om een 'nieuwe' compiler te maken welke dan ook rekening houdt met classes en datatypes, waardoor die regel wel een fout zou geven.

Roenes
%Europe/Berlin %820 %2006, 19:41
maar dan vraag ik me af: als je AS 2.0 in het leven roept, waarom dan alles terug omzetten naar 1.0 bij het compilen? Dan lijkt het mij logischer om een 'nieuwe' compiler te maken welke dan ook rekening houdt met classes en datatypes, waardoor die regel wel een fout zou geven.Misschien hadden ze bij MM op dat moment niet daar niet de tijd/middelen voor. Met AS 3 komt er een compleet nieuwe VM uit die geschreven is voor AS 3 en daar zullen dit soort fouten/bugs/features (hoe je het maar noemen wilt ;)) waarschijnlijk niet meer in zitten :)

kH_
%Europe/Berlin %875 %2006, 21:00
Mensen zonder programmeerkennis snappen dit soort zaken toch echt niet, wanneer je geen vergelijkingen trekt met de wereld waarin we leven. Het is zeker wel een mooi stukkie hoor, begrijp me niet verkeerd!
Ik zie echter bijvoorbeeld ineens dat je het hebt over een woord als debuggen, ik vraag mij dan direct af....wat is jullie doelgroep? Als je een programmeertaal gaat uitleggen op een programmatische wijze, dan neem ik toch zeker aan, dat je verwacht dat mensen al kunnen programmeren.

Dauntless
%Europe/Berlin %877 %2006, 21:04
Onze doelgroep zijn mensen die een goede basischkennis van AS 1.0 hebben en willen overstappen op AS 2.0. Dus in zekere zin verwachten we idd dat de lezer al kan programmeren (in as 1.0).

kH_
%Europe/Berlin %946 %2006, 22:43
Ok, dan is het inderdaad een mooi stukje.

Btw...je spreekt jezelf tegen in het volgende:

Het is niet mogelijk om een variabele van type te veranderen. Maar... Er zijn wel achterdeurtjes

Wat deed je daarvoor dan? Casting is nu juist het omzetten (casten) van het ene datatype naar het andere. Je gaf daarvoor zelfs een voorbeeld hiervan (Number(tekst)).

Btw...je kunt ook gerust objecten casten. Neem bijvoorbeeld het casten van een object naar een object dat een bepaalde interface implementeert, dat is reuze handig om er bijvoorbeeld zeker van te zijn, dat het object een bepaalde specifieke functie implementeert, bijvoorbeeld:
interface IDraw
{
public function doDraw():Void
}

class Circle implements IDraw
{
public function doDraw():Void
{
trace("Drawing a circle");
}
}

class FigureContainer
{
private var figures:Array=new Array();
public function iterateOverFigures():Void
{
//Doorloop in juiste volgorde (dus niet for var in)
for(var i=0;i<figures.length;i++)
{
//CAST naar juiste interface
IDraw(figures[i]).doDraw();
}
}
}

Volgens mij werkt bovenstaande (zou wel moeten). Heb het niet uitgetest ofzo, maar het voorbeeld lijkt me zo wel zichzelf uit te leggen.

Maar ik neem aan, dat jullie dit wel behandelen bij het behandelen van klassen? AS type-checkt hier trouwens helemaal niet op (komt pas in AS 3.0 denk ik), dus je kunt gewoon simpel zeggen "figures[i].doDraw()" en dat slikt ie gewoon. Daarom is het interface
principe binnen AS 2.0 ook compleet zinloos, je hebt er eigenlijk geen ruk aan. Puur voor netjes programmeren is het echter wel zinvol. Een taal zoals OO, dat wel volledig OO is checkt hier wel op.

Btw...wanneer komt er AS 2.0 syntax highlighting functionaliteit in dit forum ;)

Dauntless
%Europe/Berlin %961 %2006, 23:03
Wat deed je daarvoor dan? Casting is nu juist het omzetten (casten) van het ene datatype naar het andere. Je gaf daarvoor zelfs een voorbeeld hiervan (Number(tekst)).
Dat was wat slecht omschreven. Ik bedoel dus: Je kan een variabele zelf niet van type veranderen, zonder hem te herdefiniëren. Je kan hem wel casten zodat je die variabele in de vorm van een ander datatype aan een andere variabele kan toekennen... Pff, niet simpel uit te leggen :S .

Ik bedoel dus, dit kan NIEt
var myVar:Number = 5;
myVar = "dauntless";
en dit ook niet
myVar = String(myVar);

Omdat myVar van het type number is...

En over die objecten heb je waarschijlijk wel gelijk ja :).

Roenes
%Europe/Berlin %963 %2006, 23:06
Met andere woorden:

Dauntless bedoelt met bovenstaande post dat je de variabele zelf niet van type kan veranderen (ook niet door casten) maar de waarde van een variabele kan wel veranderen van type. Dit gebeurt wel door middel van casten :)

Dauntless
%Europe/Berlin %963 %2006, 23:07
Juist :D . De woorden ontsnapte me even ;).

kH_
%Europe/Berlin %964 %2006, 23:08
Ok, dan heb je inderdaad gelijk hoor :D

En dat is nu juist ook het grote voordeel van AS 2.0. Alleen nog een beetje jammer, dat het toekennen van een type aan een variabele niet geforceerd wordt. Dan zou het alleen wel niet meer backwards compatible zijn, maar ja...men moet nu ook eens een keer kappen met AS 1.0 te gebruiken, of Macromedia moet direct bij het opstarten van Flash vragen of je met 1.0 of 2.0 aan de gang wilt :)

Roenes
%Europe/Berlin %965 %2006, 23:09
Kappen met AS 1 kan niet aangezien AS 2 toch heel sterk leunt op AS 1. ;) AS 3 is alweer een heel ander verhaal omdat heel veel dingen anders zijn opgedeeld. Ook is er veel geschoven in packages en dergelijke. Maar dat voert te ver door voor nu :)

kH_
%Europe/Berlin %969 %2006, 23:15
Met andere woorden:

Dauntless bedoelt met bovenstaande post dat je de variabele zelf niet van type kan veranderen (ook niet door casten) maar de waarde van een variabele kan wel veranderen van type. Dit gebeurt wel door middel van casten :)
Oei, daar zeg je wel ff iets 'gevaarlijks'. Wat versta jij onder waarde namelijk? Als jij een object cast naar een ander object behandel jij dat object wel degelijk als dat andere object en heb je eigenlijk het type gewijzigd (nou ja, je behandelt het als type, dus daarom noem ik het een 'gevaarlijke' opmerking).

Btw...jullie hebben het nu al over klassen hoor, want String en Number zijn wel degelijk 'fully-fledged' klassen!!! Is het voor de duidelijkheid niet beter om onderscheid te maken tussen primitive types en complex types? Je kunt namelijk wel zo'n beetje stellen, dat vrijwel alles binnen AS 2.0 een klasse is!

Dauntless
%Europe/Berlin %979 %2006, 23:30
kH_, je bedoelt hetzelfde als Roenes en ik hoor, we kunnen het alleen alledrie niet echt exact verwoorden :p.

(Ohja, leuk dat je terug bent, kH_ ;)).

kH_
%Europe/Berlin %980 %2006, 23:31
Haha....is wel goed joh, ik zal trouwens ff ophouden met dat geneuzel tussendoor, want zo raakt iedereen in de war.

En inderdaad, kH_ de onruststoker is er weer :)