2009-06-23 12 views
1

Ich bin sehr neu zu Flash und ActionScript 3. Ich habe viel darüber gelesen und dies ist auch mein erster Schritt zur objektorientierten Programmierung.Schreib ich AS3 richtig?

Bisher habe ich eine Anwendung mit einem Login-Button erstellt, das ist alles. Ich würde jedoch gerne wissen, welche Dinge ich falsch mache oder anders machen sollte (oder besser). Ich bin mit Adobe Flex Builder 3.

Die Hauptactionscript-Datei ist Client2.as:

package 
{ 
    //import required libraries 
    import flash.display.Sprite; 

    //set project properties 
    [SWF(width="800", height="600", frameRate="31", backgroundColor="#C0C0C0")] 

    //launch main class 
    public class Client2 extends Sprite 
    { 
     public function Client2() { //the constructor 
      trace("Client launched."); 
      var loginGui:LoginInterface = new LoginInterface(); //load the login interface object 
      loginGui.init(); //initialize the login interface (load it) 
      addChild(loginGui); //add login gui to the display tree 
     } 
    } 
} 

Es wird das Login-Interface-Objekt geladen werden. Ist das eine gute Sache, und mache ich es richtig?

Dann gibt es die LoginInterface.as Klassendatei:

package 
{ 
    //import required libraries 
    import flash.display.Sprite; 

    //the LoginInterface class 
    public class LoginInterface extends Sprite 
    { 
     public function LoginInterface() //the constructor 
     { 
      trace("LoginInterface object loaded."); 
     } 

     public function init():void //initialize the login interface (load it) 
     { 
      trace("LoginInterface init method was called."); 
      var loginButton:CustomButton = new CustomButton(300, 300, 100, 30, 3, 18, "Login!"); //create a new custom button 
      addChild(loginButton); //add the custom button to the display tree 
     } 
    } 
} 

Was ist das? Irgendwelche Kommentare? Um die Erstellung von einfachen Tasten ein wenig zu erleichtern, habe ich dann eine andere Klasse Datei namens CustomButton.as ->

package 
{ 
    import flash.display.SimpleButton; 
    import flash.display.Sprite; 
    import flash.text.TextField; 
    import flash.text.TextFormat; 
    import flash.text.TextFormatAlign; 

    public class CustomButton extends Sprite 
    { 
     public function CustomButton(xLoc:int, yLoc:int, width:int, height:int, iLabelOffset:int, fontsize:uint, label:String) 
     { 
      //create new simple button instance 
      var myButton:SimpleButton = new SimpleButton(); 
      //create the look of the states 
      var normal:Sprite = new Sprite(); 
      normal.graphics.lineStyle(1, 0x000000); 
      normal.graphics.beginFill(0x6D7B8D); 
      normal.graphics.drawRect(xLoc, yLoc, width, height); 
      //the mouseover sprite 
      var over:Sprite = new Sprite(); 
      over.graphics.lineStyle(1, 0x000000); 
      over.graphics.beginFill(0x616D7E); 
      over.graphics.drawRect(xLoc, yLoc, width, height); 
      // assign the sprites 
      myButton.upState = normal; 
      myButton.downState = normal; 
      myButton.hitTestState = normal; 
      myButton.overState = over; 
      //add the button to the display tree 
      addChild(myButton); 

      //create button label 
      var tText:TextField = new TextField(); 
      tText.mouseEnabled = false, 
      tText.x = xLoc; 
      tText.y = yLoc + iLabelOffset; 
      tText.width = width; 
      tText.selectable = false 
      var Format:TextFormat = new TextFormat(); 
      Format.font = "Arial"; 
      Format.color = 0x000000; 
      Format.size = fontsize; 
      Format.bold = false; 
      Format.align = TextFormatAlign.CENTER; 
      tText.defaultTextFormat = Format; 
      tText.text = label; 
      addChild(tText) 
     } 
    } 
} 

Gibt es etwas zu diesem Thema zu äußern? Ich bin mir sicher, dass ich viele Dinge falsch mache, vielleicht habe ich nicht die ganze objektorientierte Sache bekommen? Außerdem habe ich ein schlechtes Gefühl dafür, wie ich nach einer Klassendeklaration das "extends ..." benutze, hauptsächlich weil ich Sprite die ganze Zeit benutze und nicht wirklich verstehe warum oder was es tut (Probleme haben) im Internet auch herausfinden). Eine andere Sache, über die ich mich nicht sicher bin, ist die Benennung von Variablen in AS3. Sollte ich wirklich Namen wie xLoc oder iLabelOffset verwenden? Ich denke, ich bin nicht sehr konsequent in meiner Variablennamen zumindest?

Ich hoffe, jemand kann mir einen besseren Track geben als den, auf dem ich jetzt bin, da ich mir sicher bin, dass ich meine AS3-Codierung verbessern sollte, bevor ich weiter an diesem Biest arbeite.

Vielen Dank.

+0

gut zu sehen, die framerate 31 mythos lebendig und munter! – spender

+0

Was ist der FR31-Mythos? Ich habe danach gesucht, aber nur gefunden, dass viele Leute 31 bevorzugen. – invertedSpear

Antwort

3

Meine Meinung:

Eine Klasse namens Client2 ist wahrscheinlich eine schlechte Namensgebung Wahl. Client2 sagt mir nicht viel. Wie viel wird es dir in einem Jahr erzählen?

In CustomButton wird die Initialisierung im Konstruktor vorgenommen. In LoginInterface erfordert die Verwendung einer Instanz der Klasse einen expliziten Aufruf von init(). Einfach zu vergessen und unnötig. Wenn es keinen guten Grund gibt, dies nicht zu tun, rufen Sie init vom Konstruktor auf.

Was bedeutet iLabelOffset? besser, einen weniger verwirrenden Namen in einer Parameterliste zu verwenden.

Die Parameterliste des CustomButton-Konstruktors ist ziemlich lang. Es ist nicht notwendig, das X und Y zu übergeben. Sprite hat bereits eine x- und y-Eigenschaft, also setze alles auf einen Null-Offset zurück und manipuliere die x- und y-Eigenschaften des CustomButton, sobald es erstellt ist.

Setzen Sie die übrigen Parameter des CustomButton-Konstruktors in eine Neuordnung um, sodass Sie Standardparameter angeben können (die nur am Ende der Parameterliste angegeben werden können). labelOffset und fontSize scheinen gute Kandidaten zu sein.

Die Funktionsgröße klein halten, indem der wiederholte Code entfernt wird. Erstellen Sie eine Funktion zum Erstellen des Schaltflächenstatus Sprites, die in ihren Parametern eine Farbe annimmt (oder noch besser diese Funktionalität in eine neue Sprite-Klasse umwandelt) und eine createLabel-Funktion hinzufügt, damit Sie diesen Code aus der Klasse entfernen können Konstrukteur.Ihr Code wird einfacher zu lesen und zu warten, wenn Sie versuchen, die Funktionsgröße klein zu halten. Es bedeutet auch, dass Sie weniger Kommentare schreiben müssen ;-)

2

Spender schlug den Nagel auf den Kopf. Das sind definitiv die Probleme, die auftreten, wenn ich über Ihren Code schaute. Die Dinge, die er erwähnt hat, sind keine unnötigen Actionscript-Probleme, (das Problem ist nicht das richtige Wort, vielleicht "zu beachtende Bereiche"), das sind allgemeine Probleme für alle Programmiersprachen. Beschreibende Benennung zum Beispiel ist extrem wichtig.

Es gibt einige Bücher, die sich auf diese Seite der Programmierung konzentrieren, und noch weniger, die es gut machen. Ich würde empfehlen, die folgenden zwei Bücher Aufnehmen, wenn Sie mehr in diesem Bereich wachsen wollen, (ich werde es auch empfehlen, wenn Sie nicht wollen, zu :)

Code Complete

The pragmatic programmer

Da sind beide Bücher, die jeder Programmierer lesen sollte, also schau sie dir an. Ihr Code aus Sicht von Actionscript ist in Ordnung, aber das ist nur Syntax. Es ist wichtig zu beachten, dass diese Fähigkeit niemals entwickelt wird, wenn Sie nicht wirklich Code schreiben, also "weiter an diesem Biest arbeiten" und der Rest wird folgen.

0

Nur als eine Frage des Stils möchte ich meine Variablen außerhalb des Konstruktors deklarieren. Es hilft mir zu glauben, dass ich keine Überraschungen mit öffentlichem oder privatem Publikum haben werde. Beachten Sie auch den hinzugefügten Leerraum, der die Lesbarkeit verbessern kann.

public class CustomButton extends Sprite 
{ 
    private var myButton:SimpleButton; 
    private var normal:Sprite; 
    private var over:Sprite; 
    // etc ... 

    public function CustomButton(xLoc:int, yLoc:int, width:int, height:int, iLabelOffset:int, fontsize:uint, label:String) 
    { 
      //create new simple button instance 
      myButton = new SimpleButton(); 

      //create the look of the states 
      normal = new Sprite(); 
      normal.graphics.lineStyle(1, 0x000000); 
      normal.graphics.beginFill(0x6D7B8D); 
      normal.graphics.drawRect(xLoc, yLoc, width, height); 

      //the mouseover sprite 
      over = new Sprite(); 
      over.graphics.lineStyle(1, 0x000000); 
      over.graphics.beginFill(0x616D7E); 
      over.graphics.drawRect(xLoc, yLoc, width, height); 

      // etc ...