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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.04.2010, 17:59
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 31  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
Сообщение от Котяра Посмотреть сообщение
передавать в вид только IModel в котором, например,есть один только метод addChangeModelEventListener
сломать конечно можно но это будет уже очень явно.
Конечно, сломать можно всё делая это специально - когда говорил "сломать" подразумевалось конечно же "ненароком менял вьюшку, а полетела всё остальное".
С этим появляется ещё 2 вопроса:
7) Насколько это хорошая практика - делать по 40 разных событий для 40 изменений - то есть, если изменился угол поворота чей нибудь - не обновлять положение в пространстве, а лишь повернуть (то есть разбиение например updatePositionEvent на updateXYPositionEvent и updateRotationEvent)
8) Если передается только интерфейс, тогда вся инфа об обновлении должна поступить вместе с Event`ом, а не через геттеры от модели о нужной информации?

Старый 06.04.2010, 18:22
mexoboy вне форума Посмотреть профиль Отправить личное сообщение для mexoboy Найти все сообщения от mexoboy
  № 32  
Ответить с цитированием
mexoboy

Регистрация: Dec 2009
Сообщений: 48
Цитата:
Сообщение от etc Посмотреть сообщение
cpu
1) view имеет ссылку на модель;
2) Контроллер на них обоих;
3) Модель отправляет события вьюверу. Вьювер — контроллеру.
etc, ты ничего не путаешь? Представление и модель не должна иметь никаких связей (если мы говорим об оригинальном потерне MVC). Весь обмен данными идет через контроллер. В зависимости от типа модели (к примеру тонкой), контроллер может взять на себя роль прокси между моделью и представлением и обратно. Вся инициализация эвентов, логики, моделей - должна происходить в контроллере.

Старый 06.04.2010, 18:50
cpu вне форума Посмотреть профиль Отправить личное сообщение для cpu Найти все сообщения от cpu
  № 33  
Ответить с цитированием
cpu

Регистрация: Mar 2010
Сообщений: 223
mexoboy +1

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

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от Ariel Посмотреть сообщение
2ЦПУ; 2ДИМАРИК ::
"точно" ни разу не точно. Это только одна из реализаций, причем не самая чистая. Мука почитать (и на ВИКИ посмотреть) так выходит, что все данные+логика тройки - в модель. Это будет классическая имплементация MVC. И ходят оне парами как M+VC, т.е. при замене Вью меняем и Контроллер к нему. На эти темы уже копий переломано!...
Привет! Ваш пост номер 13 и Вы выиграли поездку в кАННЫ на очередной фестиваль КО)
По сути. ТОЧНО есть точно.

Добавлено через 8 минут
Цитата:
Сообщение от cpu Посмотреть сообщение
1. View не имеет ссылок никуда, только рассылает события в контроллер
Просто рассылает события. Когда Вы кричите "Пожар!!", адресуете любому слышащему.

Добавлено через 10 минут
Цитата:
Сообщение от Котяра Посмотреть сообщение
А вообще я последнее время сильно охладел к MVC - как к универсальному решению) выхожу из стадии abstraction freek)
Для тебя уже поздно ) Ты заражён MVC.

Добавлено через 14 минут
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
2) Да, действительно - вьюшка может менять что нибудь у модели и контроллер сойдёт с ума - получается, у этой триады даже пиша вьюшку надо быть аккуратным, потому что можешь всё сломать?
А мы дадим ей только читать )
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 07.04.2010, 00:01
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 35  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
Цитата:
А мы дадим ей только читать )
Ну да, спасибо, это один из самых малозначимых вопросов на данный момент =)

Подписываюсь к вопросу о том, что нужно ли вьюшке иметь ссылку на модель и если нет - как получать данные об обновлении.

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

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от mexoboy Посмотреть сообщение
etc, ты ничего не путаешь? Представление и модель не должна иметь никаких связей (если мы говорим об оригинальном потерне MVC).
Расскажите нам об оригинальном паттерне, пожалуйста.

Добавлено через 44 секунды
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Ну да, спасибо, это один из самых малозначимых вопросов на данный момент =)

Подписываюсь к вопросу о том, что нужно ли вьюшке иметь ссылку на модель и если нет - как получать данные об обновлении.
Одназначна (с).
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

Регистрация: Dec 2006
Сообщений: 230
Гр-н Димарик реально радует своими ч0ткими и однозначными ответами.
P.S. Поездку в Канны присылайте пожалуйста по электрической почте.


Последний раз редактировалось Ariel; 07.04.2010 в 00:56.
Старый 07.04.2010, 09:56
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 38  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Цитата:
Сообщение от Psycho Tiger Посмотреть сообщение
Конечно, сломать можно всё делая это специально - когда говорил "сломать" подразумевалось конечно же "ненароком менял вьюшку, а полетела всё остальное".
С этим появляется ещё 2 вопроса:
7) Насколько это хорошая практика - делать по 40 разных событий для 40 изменений - то есть, если изменился угол поворота чей нибудь - не обновлять положение в пространстве, а лишь повернуть (то есть разбиение например updatePositionEvent на updateXYPositionEvent и updateRotationEvent)
8) Если передается только интерфейс, тогда вся инфа об обновлении должна поступить вместе с Event`ом, а не через геттеры от модели о нужной информации?
вот эти вопросы самые сложные ( во всяком случае для меня)
в своеё реализации mvc я диспатчил события для изменения любого отдельного свойства
подписывался также.
вот пример из рабочего проекта ( as2)
Код AS1/AS2:
class ru.k0t0vich.mvc.models.Model extends EventDispatcher
{
 
	public function Model(eventParentLink) 
	{
		eventParent = eventParentLink;
	}
 
	/**
	 *  Диспатчим событие об изменении структуры
	 * @param	field - имя поля (должно присутьствовать в  классе, иначе генерируется ошибка времени выполнения)
	 */
	public function update(field:String):Void
	{
		if (field == undefined) field = "";
		var event: ModelEvent= new ModelEvent(ModelEvent.CHANGE+field);
		// Проверка на доступность свойства
		if (field != "")
		{
			try
			{
			event.field = this[field];
			}
			catch (e:Error)
			{
				trace (e);
			}
			dispatchEvent(event);
		}
		else
		{
			event.field = this;
			dispatchEvent(event);
		}
 
 
	}
 
}
подписка во вью:
Код AS1/AS2:
		public function addChangeModelFieldListener(field:String,listener:Function,scope:Object):Void
		{
			_model.addEventListener(ModelEvent.CHANGE + field, listener,scope);
                        // регистрируем для отписки от ВСЕХ событий модели
			_modelFieldEventListenersArray.push( { event:ModelEvent.CHANGE + field, listener:listener,scope:scope } );
		}
пример подписки:
Код AS1/AS2:
	/**
	 * Инициализацие хэндлеров изменения модели
	 */
	private function initModelListeners()
	{
		addChangeModelFieldListener(SlotModelField.LINES, showLinesByModel, this);
		addChangeModelFieldListener(SlotModelField.FREESPINS, updateFreespinsCounter, this);
		addChangeModelFieldListener(SlotModelField.WIN, updateFreespinsCounter, this);
	}
косяков в такой реализации много ( нет строгой типизации итп) но многое лечится вводом класса констант SlotModelField. доступ к геттерам модели у меня кстати тоже так сделан,
Код AS1/AS2:
private function updateFreespinsCounter(e:ModelEvent):Void
	{
		freespinsCounterWindow.freespins = model[SlotModelField.FREESPINS];
		freespinsCounterWindow.cash = model[SlotModelField.WIN];
	}
хотя можно сделать в IModel геттеры этих свойств - я не сделал т.к. при добавлении публичных обновляемых свойств в модели пришлось бы редактировать уже 3 класса ( Model, ModelField и IModel) а не 2 (Model, ModelField)

модель обновляется таким образом:
Код AS1/AS2:
	public function get totalBet():Number { return _totalBet; }
 
	public function set totalBet(value:Number):Void 
	{
		_totalBet = value;		
		update(SlotModelField.TOTAL_BET);
	}
В общем практика показала относительное удобство такого подхода..
хотя могло бы быть и лучше..

PS: основная "неправильность" моего подхода была в методе update который создаёт эвент с динамическим типом field. Практика показала, что на самом деле это поле практически не используется при слушании событий, т.к. у вида есть ссылка на нужный геттер и он может его просмотреть самостоятельно, а не в качестве свойства события..
так-что можно смело переписать метод update так:
Код AS3:
         public function update(field:String):Void
	{
		if (field == undefined) field = "";
		var event: ModelEvent= new ModelEvent(ModelEvent.CHANGE+field);
		dispatchEvent(event);
 
	}
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 07.04.2010 в 12:18.
Старый 07.04.2010, 10:14
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 39  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Цитата:
Сообщение от cpu Посмотреть сообщение
Но ведь тогда view может напрямую менять данные в модели обойдя controller
Может, только это не в его компетенции.

Цитата:
Сообщение от cpu Посмотреть сообщение
Так как View имеет ссылку на модель, он может получит по этому событию данные из model для отображения, обойдя contoller(который опять неудел.)
Ещё раз: может ещё не означает, что так и должен делать. Вы можете дома открыть газ в плите и зажечь спичку через пару-тройку минут, но почему-то этого не делаете.

Старый 07.04.2010, 10:21
mexoboy вне форума Посмотреть профиль Отправить личное сообщение для mexoboy Найти все сообщения от mexoboy
  № 40  
Ответить с цитированием
mexoboy

Регистрация: Dec 2009
Сообщений: 48
Цитата:
Сообщение от dimarik Посмотреть сообщение
Расскажите нам об оригинальном паттерне, пожалуйста.
Тут собственно все описано: http://www.books.ru/shop/books/352130

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

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

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


 


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


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