Принципал AS3 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 какие интерпретации моей структуры и организации вы можете сделать? Я прочитал и следил за многими статьями о том, как вы должны логически выполнять ООП, и я думаю, что готов к некоторой настройке или критике, скорее, моего понимания того, каким должен быть класс в AS3 (я знаю, косвенно).

Некоторые конкретные вопросы:

  1. Когда я создаю экземпляр «Кнопки» из своего основного класса, должен ли я добавить его на сцену там или внутри самого класса кнопок с помощью Super?

  2. Будет ли когда-нибудь исправлена ​​ошибка «1047»? Что такое устойчивый (или более эффективный) обходной путь, кроме уже упомянутых здесь?: http://curtismorley.com/2008/10/15/actionscript-error-1047-parameter-initializer-unknown-или-не-постоянное-времени-компиляции/

  3. Чтобы обновить изменения ширины/высоты, я должен вызвать свою функцию рисования после модификации вне функции переопределения, в частности, для ширины и высоты. Есть ли правильный способ вызвать draw() через функции переопределения? Вывод ошибки не был предоставлен, но кажется, что это противоречит правилам, поэтому я просто вызываю draw() из Main в качестве исправления взлома. Возможно, написать функцию внутри кнопки, привязанную к событию измененного свойства?

Если кто-то удосужился разобрать эту стену текста, спасибо за чтение, и я ценю любую вашу критику, резкую или иную :)


person hemingway    schedule 27.08.2012    source источник
comment
Вы задаете слишком много вопросов. Я бы рекомендовал вам разделить это на несколько отдельных вопросов.   -  person sanchez    schedule 27.08.2012
comment
Я понимаю, почему это может быть полезно, но на самом деле это зависит от усмотрения читателя, что он хочет ответить. Все это было связано с проблемами, с которыми я столкнулся в этом коде; Я предпочел бы, чтобы мои вопросы были объединены, и если на них не будет ответа, я просто опубликую их на форуме.   -  person hemingway    schedule 28.08.2012
comment
Я должен иметь возможность создать одну из ваших кнопок без каких-либо дополнительных параметров, для нее должны быть установлены некоторые реквизиты по умолчанию, чтобы я мог видеть вашу кнопку так, как она была задумана, затем я добавляю цвет и т. д., чтобы переопределить ваши значения по умолчанию.   -  person Neil    schedule 29.08.2012
comment
Также вы должны проверить значения, которые я передаю вашему API, чтобы убедиться, что они находятся в пределах ожиданий вашей кнопки, например, вы не хотите, чтобы я предоставлял один и тот же цвет для текста и фона!   -  person Neil    schedule 29.08.2012
comment
Спасибо, Нил, мне нравится такой ввод!   -  person hemingway    schedule 26.09.2012


Ответы (1)


Во-первых, ваши имена переменных не являются описательными. Если вы собираетесь назвать свои переменные «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 заключается в том, что у вас не должно быть аргументов конструктора для классов представления, так как это делает невозможным их использование на временной шкале.

Вы, вероятно, обнаружите, что если вы открыты для использования временной шкалы, большая часть этой тяжелой работы уходит — вы просто добавляете поведение через класс AS и рисуете графику в IDE (используя такие вещи, как 9-фрагментное масштабирование). , фильтры и т. д., чтобы свести к минимуму проблемы с обслуживанием). Если вам нужна кнопка, которая выглядит по-другому, вы рисуете другую, прикрепляете свой класс поведения и готово.

Многие люди не понимают, что можно поддерживать хороший ООП, позволяя временной шкале взять на себя большую часть тяжелой работы. Надеюсь, это даст вам то, что вы хотите, или, по крайней мере, даст вам некоторые условия поиска, с которыми вы сможете двигаться дальше. Обратите внимание, если вы хотите узнать больше об использовании временной шкалы, отправьте ответ. Ссылки на исходный код этого были съедены, когда пост был заархивирован.

person Amy Blankenship    schedule 28.08.2012
comment
Именование переменной было преднамеренно общим. Да, я признаю, что ситуация с переменной/параметром была довольно двусмысленной, и я сказал себе, что вернусь к ней, но это отличное напоминание :) Хотя выполнение всего через код кажется наиболее управляемым, я согласен, что понимание того, как использовать временную шкалу в сочетании сделало бы для превосходного инструмента в эффективности. Если предоставление этих ссылок на источники не слишком мешает вам, это было бы здорово, поскольку это заполнило бы контекст для этого чтения. Спасибо за советы! - person hemingway; 28.08.2012
comment
flexdiary.blogspot.com/2010/04/ является дополнением к этому сообщению в блоге. А вот еще несколько файлов для предварительного просмотра, которое я сделал на тему meetup.com/atlflex/files . Я считаю, что использование временной шкалы позволяет мне как бы с легкостью управлять вожжами с кодом. - person Amy Blankenship; 29.08.2012
comment
ценим продолжение! ура :) - person hemingway; 26.09.2012