0

私の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. メインクラスから「ボタン」をインスタンス化する場合、スーパーを使用して、そこのステージに追加する必要がありますか、それともボタンクラス自体に追加する必要がありますか?

  2. 「1047」エラーは修正されますか?ここですでに述べたもの以外の持続可能な(またはより効率的な)回避策は何ですか?: http: //curtismorley.com/2008/10/15/actionscript-error-1047-parameter-initializer-unknown-or-is- not-a-compile-time-constant /

  3. 幅/高さの変更を更新するには、特に幅と高さのオーバーライド関数の外部から変更した後、描画関数を呼び出す必要があります。オーバーライド関数を介してdraw()を呼び出す適切な方法はありますか?エラー出力は提供されませんでした。ルールに違反しているようですが、ハック修正としてMainからdraw()を呼び出しています。変更されたプロパティのイベントにテザーされたボタン内に関数を記述しますか?

誰かがこのテキストの壁を解析するのをわざわざした場合は、読んでくれてありがとう。厳しいかどうかにかかわらず、あなたが持っているかもしれない批判に感謝します:)

4

1 に答える 1

0

まず、変数名はわかりやすいものではありません。変数に「c」、「t」、「lc」などの名前を付ける場合は、少なくとも、変数の目的を説明するインラインコメントを入力してください。それらを設定するパラメーターを下の方にコメントしても、実行した内容に不要なオーバーヘッドが発生します。

IDEでのコード補完が歴史的に不十分なためにこれを行った場合は、Flash BuilderまたはlineColor、textFieldなどの入力に役立つ優れたコード編集ツールの1つを使用してください。

よく調べてみると、関数のパラメータにアンダースコアを使用しないという通常の規則を逆にしたため、少なくとも部分的にこれを行ったように見えますが、プライベート/保護されたストレージにはアンダースコアを使用する必要がありますが、それ以外の場合は同じである必要があります公共の財産としての名前。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では、ビュークラスのコンストラクター引数を使用しないでください。これにより、タイムラインからビュークラスを使用できなくなります。

タイムラインを使用することに慣れている場合は、この面倒な作業の多くが解消されることに気付くでしょう。ASクラスを介して動作を追加し、IDEでグラフィックを描画するだけです(9スライススケーリングなどを使用)。 、フィルターなど、メンテナンスの手間を最小限に抑えます)。見た目が異なるボタンが必要な場合は、別のボタンを描画し、ビヘイビアークラスをアタッチして完了します。

多くの人々は、タイムラインが重労働の多くを引き継ぐことを可能にしながら、良好なOOPを維持することが可能であることを認識していません。これがあなたが望むものをあなたに与えるか、少なくともあなたが前進できるいくつかの検索用語をあなたに与えることを願っています。タイムラインの活用について詳しく知りたい場合は、投稿してください。そのソースコードへのリンクは、投稿がアーカイブされたときに食べられました。

于 2012-08-28T02:44:40.820 に答える