Правильно ли я пишу AS3? - PullRequest
       3

Правильно ли я пишу AS3?

1 голос
/ 24 июня 2009

Я очень новичок во флэш-памяти и ActionScript 3. Я много об этом читал, и это также мой первый подход к объектно-ориентированному программированию.

Пока что я создал приложение с кнопкой входа, вот и все. Тем не менее, я хотел бы знать, что я делаю неправильно или должен делать по-другому (или лучше). Я использую Adobe Flex Builder 3.

Основной файл сценария действий - 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
        }
    }
}

Это загрузка объекта интерфейса входа. Это хорошо, и правильно ли я это делаю?

Тогда есть файл класса LoginInterface.as:

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
        }
    }
}

А как насчет этого? Любые комментарии? Чтобы упростить создание простых кнопок, я создал еще один файл класса с именем 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)
        }
    }
}

Есть что-нибудь, чтобы прокомментировать это? Я уверен, что я делаю много вещей неправильно, может быть, я действительно не получил всю объектно-ориентированную вещь? Кроме того, у меня плохое предчувствие того, как я использую «extends ...» после объявления класса, главным образом потому, что я все время использую Sprite и не очень понимаю, почему или что он делает (возникают проблемы выяснить в интернете, а) Еще одна вещь, в которой я не уверен - это именование переменных в AS3. Должен ли я использовать такие имена, как xLoc или iLabelOffset? Я думаю, что я не очень согласен с моим именем переменной как минимум?

Я надеюсь, что кто-то может дать мне толчок к лучшему треку, чем тот, на котором я сейчас нахожусь, так как я уверен, что должен улучшить свое кодирование AS3, прежде чем я продолжу работать над этим зверем.

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 24 июня 2009

Мое мнение:

Класс Client2, вероятно, является неправильным выбором имен. Client2 мало что мне говорит. Сколько это скажет вам через год?

В CustomButton инициализация выполняется в конструкторе. В LoginInterface использование экземпляра класса требует явного вызова init (). Легко забыть и не нужно. Если для этого нет веских причин, вызовите init из конструктора.

Что означает iLabelOffset? лучше использовать менее запутанное имя в списке параметров.

Список параметров конструктора CustomButton довольно длинный. Не нужно переходить в х и у. У Sprite уже есть свойства x и y, поэтому верните все с нулевым смещением и управляйте свойствами x и y CustomButton после его создания.

Из оставшихся параметров в конструкторе CustomButton рассмотрите возможность их переупорядочения, чтобы вы могли предоставить параметры по умолчанию (которые могут идти только в конце списка параметров). labelOffset и fontSize кажутся хорошими кандидатами.

Сохраняйте размер функции небольшим, удаляя повторяющийся код. Создайте функцию для создания состояния кнопки Sprites, которая принимает цвет в своих параметрах (или, что еще лучше, переместите эту функциональность в новый тип производного класса Sprite), а также добавьте функцию createLabel, чтобы вы могли перемещать этот код из конструктор. Ваш код станет легче читать и поддерживать, если вы попытаетесь сохранить небольшой размер функции. Это также означает, что вы должны писать меньше комментариев; -)

2 голосов
/ 24 июня 2009

Спендер ударил гвоздь по голове. Это определенно те проблемы, которые возникли, когда я просмотрел ваш код. Вещи, о которых он упомянул, не являются проблемами ActionScript (проблема - не совсем правильное слово, возможно, «области, на которые следует обратить внимание»), это общие проблемы для всех языков программирования. Например, описательное наименование чрезвычайно важно.

Есть несколько книг, посвященных этой стороне программирования, и еще меньше, которые делают это хорошо. Я очень рекомендую взять следующие две книги, если вы хотите больше расти в этой области, (я рекомендую, даже если вы не хотите тоже:)

Код завершен

Прагматичный программист

Там обе книги, которые должен прочитать каждый программист, так что ознакомьтесь с ними. Вы код с точки зрения Actionscript, но это всего лишь синтаксис. Важно отметить, что эти навыки никогда не будут развиваться, если вы на самом деле не напишите код, поэтому непременно " продолжайте работать над этим зверем ", а остальные будут следовать его примеру.

0 голосов
/ 23 января 2010

Так же, как стиль, я люблю объявлять свои переменные вне конструктора. Это помогает мне чувствовать, что у меня не будет никаких сюрпризов с общедоступным или частным. Также обратите внимание на добавленные пробелы, которые могут улучшить читаемость.

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 ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...