Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 25-01-2006, 15:03   #1 (permalink)
Linksaußen
 
Benutzerbild von Fralle
 
Registriert seit: Jun 2003
Ort: Essen
Beiträge: 558
saubere Variablendeklaration

sicher gibt's schon einige Post's zu diesem Thema, trotzdem hab' ich noch ein paar Fragen dazu (auch weil in der Hilfe von Flash 8 in den Codebeispielen die Deklaration jetzt ein bisschen anders aussieht als bisher)

Im Grunde kann man unterscheiden zwischen 3 Arten:
Code:
    meineVar = 0; var meineVar = 0; var meineVar:Number = 0;
der Unterschied zwischen 1 und 2 ist mir eigentlich klar: lokal und global
Aber: ist es auch ein Unterschied wenn die Deklaration auf der Hauptzeitleiste (also _root.) stattfindet? Dann ist doch sowieso beides global, oder nicht?
dann:
Wenn ich in einer Funktion eine Schleife habe:
Code:
    for (var i = 0; i < 10; i++)  {...}
und dann danach in der gleichen Funktion nochmal eine Schleife vorkommt:
Code:
    for (var i = 0; i < 10; i++)  {...}
dann existiert die Variable "i" doch schon. Macht es da dann einen Unterschied, ob man den Deklarationsvorsatz "var" benutzt? Wie sollte man es richtigerweise machen?

darüber hinaus taucht nun in der Hilfe immer wieder diese Schreibweise auf:
Code:
    for (var i:Number = 0; i < 10; i++)  {...}
Wie "wichtig" ist dieses Number? Wie "schlimm" ist es, wenn man's weglässt? (p.s.: Kenne den Unterschied zwischen Number und String...)

Ich wär' doch so gern ein "sauberer" Programmierer!!
...muss aber doch immer wieder feststellen, daß ich nur 'ne Drecksau bin...
__________________
Der Ball ist rund
Fralle ist offline   Mit Zitat antworten
Alt 25-01-2006, 15:16   #2 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.272
Sauber wäre dann keine Schleife im _root

Wenn du deine Schleifenvariable in einer Funktion definierst, dann ist sie auch lokal und nach Ablauf der Funktion in der GarbageCollection.

Code:
function init(): Void
{
	for( var i: Number = 0 ; i < 1 ; i++ )
	{
		trace( i );
	}
}

init();

trace( i );
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 25-01-2006, 15:28   #3 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg
Beiträge: 4.385
wobei ich dann mehr auf
PHP-Code:
var Number;

for (
010i++) {
    
trace(i);

stehe, da die Variablendeklaration eigentlich nicht ins for gehört.

Wichtig auch, dass du eine Variable nicht mehrfach deklarierst (wie es Macromedia so gerne macht), da dies dann im Mtasc nicht mehr funktioniert.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 25-01-2006, 15:43   #4 (permalink)
Linksaußen
 
Benutzerbild von Fralle
 
Registriert seit: Jun 2003
Ort: Essen
Beiträge: 558
Zitat:
Zitat von Janoscharlipp
Wichtig auch, dass du eine Variable nicht mehrfach deklarierst (wie es Macromedia so gerne macht), da dies dann im Mtasc nicht mehr funktioniert.
das meine ich ja! wieso aber macht MM das so und gibt diese Codebeispiele in der Hilfe?
__________________
Der Ball ist rund
Fralle ist offline   Mit Zitat antworten
Alt 25-01-2006, 16:28   #5 (permalink)
Trace Schwester
 
Benutzerbild von VdSnorri
 
Registriert seit: Sep 2005
Beiträge: 135
mal meine Bescheidene Meinung dazu:

Code:
    i = 0
ist old dirty stuff

Code:
    var i = 0
ist nicht global sonder lokal

Code:
    _global.i = 0
dies wäre global

Code:
    var i:Number = 0
ist mit Typisierung und geht nur in Zusammenhang mit
Code:
    var
Die Typisierung erlaubt Flash eine Kontrolle bei der Übergabe von Parametern und bei der Verarbeitung, daher sehr nützlich. Weiterhin wird dir beim Punkt Operator stehts die zum Typ gehörenden Funktionen angezeigt. Wiederum sehr nützlich.

Code:
    for( i:Number = 0; i < 10; i++ ) { ... }
ist meiner Ansicht nach ebenso sinnvoll, da i als Laufvariable nur in der For-Schleife Verwendung findet, weshalb sollte man sie daher ausserhalb deklarieren, das bringt nur Verwirrung mit sich.

Code:
    for( i:Number = 0; i < 10; i++ ) {     for( i:Number = 0; i < 10; i++ ) {        ...     } }
Ein solches Konstrukt ist ein einziger Fehler, wie gesagt i Doppelt definiert ... sollte unbedingt verhindert werden.
VdSnorri ist offline   Mit Zitat antworten
Alt 05-02-2006, 16:19   #6 (permalink)
Neuer User
 
Benutzerbild von launcher
 
Registriert seit: Mar 2002
Beiträge: 108
da helft mir doch mal auf die Sprünge!

Habe gerade bei meiner Suche nach einem Variablen-Deklarations-Problem im Forum dieses Thema gefunden. Ich liebte ja bisher diesen Weg, weil er schnell und unkompliziert ist:

Code:
fade_speed=4
Aber man soll ja Neuerungen gegenüber offen sein und deshalb habe ich mich mal mit der neuen empfohlenene Deklaration beschäftigt:

Code:
var fade_speed:Number = 4;
Von mir aus, dachte ich, gibt zwar keine schöne ESC-Tastenkombi und man muss Number immer ausschreiben aber was solls, wenn es sauberer (und angeblich schneller) ist ... okay.

Mit entsetzen musste ich feststellen, dass trotz meiner sauberen Deklaration (fade_speed ist eine Zahl) folgender Code nicht funktioniert, wenn fade_speed über ein Eingabefeld auf der Bühne geändert wird!

Code:
_root.mc._alpha += _root.fade_speed;
Was ist das denn fürn Mist? Da bleibe ich doch lieber bei meiner alten Methode, weniger Schreibarbeit und man muss nicht ne 1/2 Stunde Fehler suchen.

Funktionieren tuts übrigens nur so:

Code:
_root.mc._alpha += parseInt(_root.fade_speed);
launcher ist offline   Mit Zitat antworten
Alt 05-02-2006, 19:13   #7 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.272
@launcher: In welcher (Flash-) Version hast du das getestet ? Kann doch eigentlich gar nicht sein.
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 05-02-2006, 19:19   #8 (permalink)
Neuer User
 
Benutzerbild von launcher
 
Registriert seit: Mar 2002
Beiträge: 108
Hallo André,

Flash 8, veröffentlich für F8 AS2.

Ist verrückt, oder?

-------------------------------------

Hier noch ein Beispiel:

Code:
var a:Number = 5;
var b:Number = 2;
var c:Number = 7;
this.onEnterFrame = function() {
	c = a+b;
};
Ändert man in einem Eingabefeld auf der Bühne a in 4 - steht im dyn. textfeld c: na, wer weiß es?, richtig: 42

Geändert von launcher (05-02-2006 um 19:42 Uhr)
launcher ist offline   Mit Zitat antworten
Alt 05-02-2006, 19:44   #9 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.272
Ach so: Eingabefeld. Das ist richtig, weil immer Type String.

Also die Typen werden nur während des Kompilierens hinzugezogen und eben eventuelle Fehlermeldungen generiert. Während der Laufzeit werden keine Typen irgentwohin gebogen. Daher ist dein Fall auch etwas unschön, denn Eingaben in ein Textfeld sind immer Strings (per default). Das es früher ging ist aber aus meiner Sicht eher zu bemängeln, als das es jetzt nicht mehr geht. Es fehlt allerdings der CompilerError. In AS3 ist das alles viel besser gelöst.

Richtig wäre dann folgende Vorgegehensweise über beispielsweise ein UpdateEvent.

Code:
var value: Number = 0;

inputField.onChanged = function(): Void
{
	value = parseFloat( this.text );
}
Ach so, dass vorbeugende Massnahmen mehr Tipparbeit mit sich bringen ist klar :)
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 06-02-2006, 16:09   #10 (permalink)
Neuer User
 
Benutzerbild von launcher
 
Registriert seit: Mar 2002
Beiträge: 108
Hallo Ándre,

wenn das zur Laufzeit überhaupt nicht beachtet wird kann man sich das doch schenken, oder? Welche Vorteile (außer sauberer Code : ) hat das ganze denn sonst?

Gruß und Dank

Launcher
launcher ist offline   Mit Zitat antworten
Alt 06-02-2006, 16:24   #11 (permalink)
>>>||<<<
 
Registriert seit: Dec 2002
Ort: München
Beiträge: 208
Zitat:
Zitat von Fralle
Wie "wichtig" ist dieses Number? Wie "schlimm" ist es, wenn man's weglässt? (p.s.: Kenne den Unterschied zwischen Number und String...)
Zum einen ist das echt saubere Programmierung und zum anderen kommt man bei anderen Programmiersprachen wie C, Delphi oder Java gar nicht herum seine Variablen auch mit dem Typ zu versehen, den sie haben sollen.
Zudem schafft es transparenteren Code auch für andere, die sofort sehen welche Werte die Variable aufnehmen kann (wie z.B. eigene Datentypen wie structs o.ä.)

Uns wurde das während des Studiums schon so eingehämmert, dass ich gar micht gar nicht mehr traue eine Variable ohne Typ zu deklarieren ;-)
Viktor M. ist offline   Mit Zitat antworten
Alt 06-02-2006, 16:33   #12 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.272
Das hat echte Vorteile, wenn man stipide alles typisiert, nicht nur einfache Typen wie Strings, Number, etc.

Zum ersten minimiert es duzende von Schreibfehlern, die man einfach macht und man reduziert sein Denken auf die Vorgehensweise des Rechners, was für komplexere Projekte unbedingt nötig ist.

Richtig spannend wird es dann mit AS3, weil dort Typisierung zudem noch einen Performancegewinn mit sich bringt. Also, untypisierte Variablen müssen vom Interpreter in Echtzeit ausgewertet werden. Mit ein Grund warum Actionscript 2- so langsam ist. Letztendlich braucht die unterste Ebene im Rechner immer Typen, um überhaupt etwas interpretieren zu können. Was gehört wohin und was kann ich damit anfangen.

Für mich war die konsequente Umsetzung von Typen erst der Begin, sicherer zu programmieren.
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 06-02-2006, 16:37   #13 (permalink)
Neuer User
 
Benutzerbild von launcher
 
Registriert seit: Mar 2002
Beiträge: 108
okay, ich nehms mir zu Herzen und warte gespannt auf den Performace-Gewinn in AS3
launcher ist offline   Mit Zitat antworten
Alt 06-02-2006, 16:40   #14 (permalink)
[+]
 
Benutzerbild von André Michelle
 
Registriert seit: Dec 2002
Ort: cologne
Beiträge: 2.272
Zitat:
warte gespannt auf den Performace-Gewinn in AS3
Leg gleich los
__________________
aM

blog | laboratory | tonfall | processing

Audiotool.com
André Michelle ist offline   Mit Zitat antworten
Alt 06-02-2006, 20:34   #15 (permalink)
Linksaußen
 
Benutzerbild von Fralle
 
Registriert seit: Jun 2003
Ort: Essen
Beiträge: 558
Wie sieht's denn aus mit Variablen, die den Typ wechseln?

Also, ich hab' z.B. eine Art Countdown in einer Andwendung. Da ist also ein Textfeld welches mir _root.countdownVAR anzeigt. Ganz klar ist das während des Countdowns eine Number. Damit aber das Textfeld nach dem Countdown leer ist hab' ich im Code folgendes:
Code:
    _root.countdownVAR = "";
Da wird also die Number zum String...

Soll ich jetzt das Textfeld extra in einen MC packen und mit _visible arbeiten, oder gibt's noch andere Möglichkeiten?
Oder sollte man grundsätzlich keine Typen-Wechsel-Variablen (...so eine Schlmpe, die Variable!! ) benutzen?
Oder soll ich für den beschriebenen Fall eine zweite Countdown-Var deklarieren, die dann immer
Code:
    countdownSTR = String(_root.countdownVAR);
ist?
__________________
Der Ball ist rund
Fralle ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2014 Marc Thiele