Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 04.06.2014, 23:08
2misha вне форума Посмотреть профиль Отправить личное сообщение для 2misha Найти все сообщения от 2misha
  № 1  
Ответить с цитированием
2misha

Регистрация: Apr 2014
Сообщений: 97
По умолчанию Кнопка 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));
		}
	}
}
Буду рад любым конструктивным замечаниям.

Старый 04.06.2014, 23:47
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 2  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
ТС - как то странно разбирать MVC на примере кнопки, кнопка это чистый ВЬЮ, а не триада, в проекте кнопку на МВС не пишут, проект пишут, а не кнопку или ручку.
Пока писал увидел в последнем классе if (e.data == "true")
Так не пишут, пишут так if (e.data) или if (!e.data)

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

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

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

Старый 05.06.2014, 00:04
LifeIsRhythm вне форума Посмотреть профиль Отправить личное сообщение для LifeIsRhythm Найти все сообщения от LifeIsRhythm
  № 3  
Ответить с цитированием
LifeIsRhythm
[+1 22.07.14]
[+4 12.08.14]
[+1 09.02.15]

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

Старый 05.06.2014, 00:21
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 4  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Цитата:
увидел в последнем классе if (e.data == "true")
Так не пишут, пишут так if (e.data) или if (!e.data)
Но тут же проверка строки, а не булевого значения, по этому if (e.data) или if (!e.data) сработает неверно.

Старый 05.06.2014, 01:33
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 5  
Ответить с цитированием
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
Цитата:
Но тут же проверка строки, а не булевого значения, по этому if (e.data) или if (!e.data) сработает неверно.
Так не надо передавать строку, о том и речь. Если строка такая же как бул.

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

Старый 05.06.2014, 10:32
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 6  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Что-то вспомнилось...

Код AS3:
if ( ((((((value == true) == true) == true) == true) == true) == true) ) {
    // Похоже, что не врет!
}
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 05.06.2014, 11:20
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 7  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Цитата:
Сообщение от in4core Посмотреть сообщение
Так не надо передавать строку, о том и речь. Если строка такая же как бул.
Согласен. Я про DataEvent услышал первый раз в этой теме. И судя по документации, DataEvent передаёт данные только в string формате, от того и беда. Но это уже другая тема.

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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