Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Кнопка MVC (http://www.flasher.ru/forum/showthread.php?t=208121)

2misha 04.06.2014 23:08

Кнопка MVC
 
Итак, я создал класс кнопки с помощью шаблона MVC. Когда наводишь на неё курсор - цвет меняется, когда убираешь - становится прежним. Все работает нормально, просто хочу попросить вам проверить грамотность написания кода и сказать правильно ли я понял принцип работы MVC и правильно ли реализовал в этот примере.


Класс, что собирает вьюшки (хоть она пока одна):
Код AS3:

package net.freedomstate.elements
{
        /**
        * ...
        * @author Scorpion
        */

 
        import flash.display.*;
        import net.freedomstate.elements.but.*;
 
        public class But extends Sprite
        {
                private var _button: View;
 
                public function But(valueX: int, valueY: int, valueText: String = "")
                {
                        _button = new View(valueX, valueY, valueText);
                        addChild(_button);
                }
        }
}

Классы MVC:
Код AS3:

package net.freedomstate.elements.but
{
        /**
        * ...
        * @author Scorpion
        */

 
        import flash.display.*;
        import flash.events.*;
        import flash.geom.ColorTransform;
        import net.freedomstate.elements.TextF;
 
        public class View extends Sprite
        {
                [Embed(source = "../../../../../img/button.png")] private static const Embed: Class;
 
                private var _text: TextF;
                private var _bitmap: Bitmap;
                private var _model: Model;
                private var _controller: Controller;
                private var _originalColorTransform: ColorTransform;
                private var _over: Boolean;
 
                public function View(valueX: int, valueY: int, valueText: String = "")
                {
                        _model = new Model();
                        _controller = new Controller(_model);
 
                        _model.addEventListener(Event.ENTER_FRAME, setColor);
                        _model.addEventListener(Event.EXIT_FRAME, setOriginalColor);
 
                        _originalColorTransform = transform.colorTransform;
 
                        _text = new TextF(0, 0, valueText, "DYNAMIC", "Times New Roman");
                        _text.autoSize = "center";
                        _text.mouseEnabled = false;
 
                        _bitmap = new Embed as Bitmap;
                        _bitmap.width = _text.width + 20;
 
                        _text.y = 10;
                        _text.x = ( _bitmap.width - _text.width ) / 2;
 
                        x = valueX;
                        y = valueY;
 
                        buttonMode = true;
 
                        addChild(_bitmap);
                        addChild(_text);
 
                        this.addEventListener(MouseEvent.ROLL_OVER, rollOver);
                }
 
                private function rollOver(e: Event): void
                {
                        _over = true;
 
                        _controller.dispatchEvent(new DataEvent(Event.ENTER_FRAME, false, false, String(_over)));
                }
 
                private function setColor(e: DataEvent): void
                {
                        var newColor: ColorTransform = new ColorTransform(0.95, 0.95, 1.1);
                        this.transform.colorTransform = newColor;
 
                        this.removeEventListener(MouseEvent.ROLL_OVER, setColor);
                        this.addEventListener(MouseEvent.ROLL_OUT, rollOut);
                }
 
                private function rollOut(e: Event): void
                {
                        _over = false;
 
                        _controller.dispatchEvent(new DataEvent(Event.EXIT_FRAME, false, false, String(_over)));
                }
 
                private function setOriginalColor(e: DataEvent): void
                {
                        transform.colorTransform = _originalColorTransform;
                }
        }
}

Код AS3:

package net.freedomstate.elements.but
{
        /**
        * ...
        * @author Scorpion
        */

 
        import flash.events.*;
 
        public class Controller extends EventDispatcher
        {
                private var _model: Model;
 
                public function Controller(rModel: Model): void
                {
                        _model = rModel;
 
                        this.addEventListener(Event.ENTER_FRAME, setColor);
                        this.addEventListener(Event.EXIT_FRAME, setOriginalColor);
                }
 
                private function setColor(e: DataEvent): void
                {
                        _model.dispatchEvent(new DataEvent(Event.ENTER_FRAME, false, false, e.data));
                }
 
                private function setOriginalColor(e: DataEvent): void
                {
                        _model.dispatchEvent(new DataEvent(Event.EXIT_FRAME, false, false, e.data));
                }
        }
}

Код AS3:

package net.freedomstate.elements.but
{
        /**
        * ...
        * @author Scorpion
        */

 
        import flash.events.*;
 
        public class Model extends EventDispatcher
        {
                public function Model(): void
                {
                        this.addEventListener(Event.ENTER_FRAME, setColor);
                        this.addEventListener(Event.EXIT_FRAME, setOriginalColor);
                }
 
                private function setColor(e: DataEvent): void
                {
                        if (e.data == "true")
                        dispatchEvent(new DataEvent(Event.ENTER_FRAME));
                }
 
                private function setOriginalColor(e: DataEvent): void
                {
                        if (e.data == "false")
                        dispatchEvent(new DataEvent(Event.EXIT_FRAME));
                }
        }
}

Буду рад любым конструктивным замечаниям.:)

in4core 04.06.2014 23:47

ТС - как то странно разбирать MVC на примере кнопки, кнопка это чистый ВЬЮ, а не триада, в проекте кнопку на МВС не пишут, проект пишут, а не кнопку или ручку.
Пока писал увидел в последнем классе if (e.data == "true")
Так не пишут, пишут так if (e.data) или if (!e.data)

Во вторых, _model.dispatchEvent(new DataEvent(Event.EXIT_FRAME, false, false, e.data)); - так не делают в контроллере. Контроллер ЗАПУСКАЕТ методы модели/вида, или же работает с сеттерами.

В третьих, контроллер НЕ создается во вью, так же как и модель. Модель и ВЬЮ создаются в контроллере, вью получает либо ссылку на модель либо в констуркторе, либо через сеттер.

Так же в будущем, примите за основу, что у вас всегда есть BaseModel - база моделей ( главная модель ). В которой создаются ВСЕ остальные, а видам отдается основная модель, так как некоторые виды могут требовать БОЛЕЕ 1 модели. Конечно же можно написать Н сеттеров, но это не так удобно, когда в будущем может понадобится еще какая то модель.

LifeIsRhythm 05.06.2014 00:04

Цитата:

Пока писал увидел в последнем классе if (e.data == "true")
Так не пишут, пишут так if (e.data) или if (!e.data)
А это уже от привычки зависит.. Мне удобней, когда явно указанно с чем сравнивают, ну и прироста немного дает...

samana 05.06.2014 00:21

Цитата:

увидел в последнем классе if (e.data == "true")
Так не пишут, пишут так if (e.data) или if (!e.data)
Но тут же проверка строки, а не булевого значения, по этому if (e.data) или if (!e.data) сработает неверно.

in4core 05.06.2014 01:33

Цитата:

Но тут же проверка строки, а не булевого значения, по этому if (e.data) или if (!e.data) сработает неверно.
Так не надо передавать строку, о том и речь. Если строка такая же как бул.

Цитата:

Мне удобней, когда явно указанно с чем сравнивают, ну и прироста немного дает.
Если там бул, то надо писать бул, а не === true - это моветон вообще то.

dimarik 05.06.2014 10:32

Что-то вспомнилось...

Код AS3:

if ( ((((((value == true) == true) == true) == true) == true) == true) ) {
    // Похоже, что не врет!
}


samana 05.06.2014 11:20

Цитата:

Сообщение от in4core (Сообщение 1167367)
Так не надо передавать строку, о том и речь. Если строка такая же как бул.

Согласен. Я про DataEvent услышал первый раз в этой теме. И судя по документации, DataEvent передаёт данные только в string формате, от того и беда. Но это уже другая тема.


Часовой пояс GMT +4, время: 21:00.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.