AS3 OOP主要,结构和组织

时间:2012-08-27 18:29:48

标签: actionscript-3 oop structure organization code-organization

优化我的OOP结构,并尝试尽可能直观地显示代码, 使用基本的OOP原则这肯定有帮助,但我的工艺只走了这么远。我希望改进我的做法:

package
{
import flash.display.*;
import flash.text.*;

public class Button extends Sprite
{   
    protected var _spr:Sprite    = new Sprite();
    protected var _tf :TextField = new TextField();

    protected var c   :Number;
    protected var xx  :Number;
    protected var yy  :Number;
    protected var w   :Number;
    protected var h   :Number;
    protected var t   :String;
    protected var a   :Number;
    protected var l   :Number;
    protected var lC  :Number;

    function Button
        (
        _col:Number,                                          //beginFill
        _x:Number, _y:Number, _w:Number, _h:Number,           //drawRect
        _t:String = "",                                       //TextField (optional)
        _a:Number = 1,                                        //beginFill (optional)
        _l:Number = 0, _lC:Number = 0xFFFFFF                  //lineStyle (optional)
        )
    {
        c      = _col;
        xx     = _x;
        yy     = _y;
        w      = _w;
        h      = _h;
        t      = _t;
        a      = _a;
        l      = _l;
        lC     = _lC;

        _spr.addChild(_tf);

        draw();
    }

    public function draw ():void
    {
        _spr.graphics.clear    ();
        _spr.graphics.lineStyle(l, lC);
        _spr.graphics.beginFill(c);
        _spr.graphics.drawRect (xx, yy, w, h);

            var f:TextFormat = new TextFormat;
                f.font = "Arial";

            _tf.text     = t;
            _tf.autoSize = TextFieldAutoSize.LEFT;
            _tf.x        = xx + w/2 - _tf.textWidth  / 2;
            _tf.y        = yy + h/2 - _tf.textHeight / 1.5;
            _tf.width    = w - 2;
            _tf.height   = h - 2;
            _tf.alpha    = 0.75;

            _tf.setTextFormat(f);

            _tf.selectable   = false;
            _tf.mouseEnabled = false;

        _spr.graphics.endFill ();

    }

    /* ----------------------- *
     *         GETTERS         *
     * ----------------------- */

    //OVERRIDE

    override public function get x      () :Number {return (xx)}
    override public function get y      () :Number {return (yy)}
    override public function get width  () :Number {return (w)}
    override public function get height () :Number {return (h)}

    //SUPPLEMENTARY

    public function get col             () :Number {return (c)}
    public function get text            () :String {return (t)}
    public function get line            () :Number {return (l)}
    public function get lineC           () :Number {return (lC)}

    public function get getObj          () :Sprite {return (_spr)}

    /* ----------------------- *
     *         SETTERS         *
     * ----------------------- */

    //OVERRIDE

    override public function set x (_n:Number) :void
    { xx = getObj.x = Math.round(_n - xx) }

    override public function set y (_n:Number) :void
    { yy = getObj.y = Math.round(_n - yy) }

    override public function set width (_n:Number) :void
    { w  = Math.round(_n) }

    override public function set height (_n:Number) :void
    { h  = Math.round(_n) }

    //SUPPLEMENTARY

    public function set col    (_n:Number) :void
    {
        c = _n;
        draw();
    }

    public function set text   (_s:String) :void
    {
        t = _s;
        draw();
    }

    public function set line   (_n:Number) :void
    {
        l = _n;
        draw();
    }

    public function set lineC(_n:Number) :void
    {
        lC = _n;
        draw();
    }
}
}

从上面的Button类中,您可以对我的结构和解释做出什么解释。组织?我已阅读并阅读了许多关于你应如何在逻辑上执行OOP的文章,我认为我已经准备好进行一些调整或批评,而不是我对AS3中一个类应该如何处理的理解(我知道的是间接的。)

一些具体问题:

  1. 当我从我的Main类实例化'Button'时,我应该将它添加到舞台那里或 使用Super?

  2. 在Button Class中
  3. “1047”错误是否会被修复?除了已经提到的那些之外,什么是可持续(或更有效)的解决方案?:http://curtismorley.com/2008/10/15/actionscript-error-1047-parameter-initializer-unknown-or-is-not-a-compile-time-constant/

  4. 为了更新宽度/高度变化,我必须在修改宽度和宽度的覆盖功能之外调用我的绘图功能。高度特别。有没有通过覆盖函数调用draw()的正确方法?没有提供错误输出,似乎这样做是违反规则的,所以我只是从Main调用draw()作为黑客修复..可能在按钮中写一个函数,系住更改属性的事件?

    < / LI>

    如果有人打扰解析这一文字墙,感谢阅读,我感谢您的任何批评,苛刻或其他:)

1 个答案:

答案 0 :(得分:0)

首先,您的变量名称不具描述性。如果您要将变量命名为“c”,“t”,“lc”等,至少可以使用内联注释来描述它们的用途。即使您评论填充它们的参数较低,也会对您所做的事情产生不必要的开销。

如果你因为IDE中历史上糟糕的代码完成而这样做了,请使用Flash Builder或其中一个优秀的代码编辑工具来帮助你输入lineColor,textField等。

仔细观察,看起来你已经至少部分地完成了这项工作,因为你已经颠倒了正常的约定,那就是函数的参数而不是使用下划线,而私有/受保护的存储应该使用下划线,否则应该与公共属性具有相同的名称。更改您的约定以匹配AS3世界的其余部分将大大有助于使您的代码更具可读性。

如果您不想丢失函数参数中的下划线,可以使用FB中的片段将实例变量设置为同名参数。

在ActionScript中很好地理解了失效,所以我不确定为什么会出现问题。它看起来像这样:

protected function invalidate():void {
  _isInvalid = true;
  addEventListener(Event.ENTER_FRAME, validate);
}

protected function validate(e:Event):void {
  removeEventListener(Event.ENTER_FRAME, validate);
  if (_isInvalid) {
    draw();
  }
  _isInvalid = false;
}

在您正在调用draw()的任何地方调用它,这将减少您更新显示列表的次数。

MPO是你不应该有View Classes的构造函数参数,因为这使得它无法在时间轴中使用它们。

你可能会发现,如果你愿意使用时间轴,那么很多艰苦的工作就会消失 - 你只需通过AS类添加行为并在IDE中绘制图形(使用9之类的东西) - 缩放比例,过滤器等,以最大限度地减少维护麻烦)。如果你想要一个看起来不同的按钮,你绘制一个不同的按钮,附加你的行为类,并完成。

很多人都没有意识到maintain good OOP可能允许时间表接管大部分繁重的工作。希望这可以为您提供您想要的内容,或者至少为您提供一些您可以继续使用的搜索字词。请注意,如果您有兴趣了解有关利用时间表的更多信息,请回发。当帖子存档时,该源代码的链接就被吃掉了。