我是以正确的方式写AS3吗?

时间:2009-06-23 22:42:19

标签: flex flash actionscript-3 oop

我是flash和actionscript的新手。我已经阅读了很多关于它的内容,这也是我第一次面向对象编程。

到目前为止,我创建了一个带有登录按钮的应用程序,就是这样。但是,我想知道我做错了什么,或者应该做的不同(或更好)。我使用的是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)
        }
    }
}

有什么可评论的吗?我确信我做了很多错事,也许我没有真正得到整个面向对象的东西?另外,我对类声明之后使用“扩展...”的方式感觉不好,主要是因为我一直只是使用Sprite并且不太明白为什么或它做什么(遇到麻烦)在互联网上找到了)。我不确定的另一件事是在AS3中命名变量。我真的应该使用xLoc或iLabelOffset等名称吗?我认为我的变量命名至少不是很一致吗?

我希望有人能给我一个比我现在更好的轨道,因为我确信在继续研究这个野兽之前我应该​​改进我的AS3编码。

非常感谢。

3 个答案:

答案 0 :(得分:3)

我的意见:

一个名为Client2的类可能是一个错误的命名选择。 Client2并没有告诉我太多。在一年的时间里它能告诉你多少钱?

在CustomButton中,初始化在构造函数中处理。在LoginInterface中,使用类的实例需要显式调用init()。容易忘记和不必要。除非有充分的理由不这样做,否则请从构造函数中调用init。

iLabelOffset是什么意思?最好在参数列表中使用较少混淆的名称。

CustomButton构造函数的参数列表非常长。没有必要传入x和y。 Sprite已经具有x和y属性,因此将所有内容放回零偏移量并在构造后操纵CustomButton的x和y属性。

在CustomButton构造函数的其余参数中,请考虑重新排序它们,以便您可以提供默认参数(只能在参数列表的末尾)。 labelOffset和fontSize似乎是不错的选择。

通过删除重复的代码来保持较小的功能。创建一个函数来创建按钮状态Sprite,它在其参数中获取颜色(或者更好的是,将此功能移动到新类型的Sprite派生类中),还添加一个createLabel函数,以便您可以将该代码移出构造函数。如果尝试保持较小的函数,则代码将更易于阅读和维护。这也意味着你必须少写评论; - )

答案 1 :(得分:2)

斯宾德击中了头部的钉子。这些肯定是我查看代码时引发的问题。他提到的事情并不是非常简单的Actionscript问题,(问题不是很正确,也许是“需要注意的领域”),这些都是所有编程语言的一般问题。例如,描述性命名非常重要。

很少有书专注于编程的这一方面,而且做得更好。如果你想在这个领域增长更多,我强烈建议你选择以下两本书(即使你不想要我也推荐它)。

Code Complete

The pragmatic programmer

每本程序员都应阅读这两本书,所以请查看它们。从Actionscript的角度来看,你的代码很好,但这只是语法。重要的是要注意,除非你真正编写代码,否则这些技能永远不会发展,所以无论如何“继续在这个野兽上工作”,其余的也会效仿。

答案 2 :(得分:0)

就风格问题而言,我喜欢在构造函数之外声明我的变量。这让我觉得我不会对公共与私人或范围产生任何意外。另请注意添加的空白区域,这可以提高可读性。

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