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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.02.2013, 00:40
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 11  
Ответить с цитированием
yasha005
[+1 16.03.13]
[+1 22.03.13]

Регистрация: Dec 2012
Сообщений: 100
Цитата:
Сообщение от expl Посмотреть сообщение
Чем тогда это отличается от 2-го варианта?

Всмысле при сохранении изменений (например, вместе с коммандами) получаем состояния:
1:добавить круг в 0, 0 ->
2:добавить прямоугольник в 0, 0 ->
3:повернуть прямоугольник на 90º->
4:Удалить прямоугольник

Вариант с состояниями:
1:круг(0,0) ->
2:[ссылка на 1:], прямоугольник(0, 0, 0º) ->
3:[ссылка на 1:], прямоугольник(0, 0, 90º) ->
4:[ссылка на 1:]
Как бы получение структуры [3:[ссылка на 1:], прямоугольник(0, 0, 90º)] по предыдущей [2:[ссылка на 1:], прямоугольник(0, 0, 0º)] и действиям пользователя уже выглядит нетривиально

- Как компактно сохранить состояния не сохраняя изменений?
- Как это сделать просто на _нефункциональном_ языке?
- А если таки сохранять изменения, а не данные, то в чём разница?

- Зачем это всё, если можно просто сохранить изменение вместо сохранения состояния? - И вычислять ничего не надо будет - никаких дифов между старым и новым снимать не надо
Как вариант воспользоваться одним из поведенческих шаблонов проектирования. Например шаблон "Состояние".

Состоит из следующих компонентов:
Код:
1. Интерфейс состояния
2. Контекстный класс
3. Классы контекста состояния
4. Клиент
Код AS3:
package 
{
	//State Machine Interface
	// Интерфейс автомата состояний
	interface State
	{
		function startPlay():void;
		function stopPlay():void;
	}
}
Код AS3:
package 
{
	//Context class
	// Контекстный класс
	class VideoWorks
	{
		var playState:State;
		var stopState:State;
		// Переменная для хранения текущего состояния
		var state:State;
 
		public function VideoWorks()
		{
			trace("Video Player is On");
			playState = new PlayState(this);
			stopState = new StopState(this);
			state = stopState;
		}
		public function startPlay():void
		{
			state.startPlay();
		}
		public function stopPlay():void
		{
			state.stopPlay();
		}
 
		// Методы получатели и установщики
		public function setState(state:State):void
		{
			trace("A new state is set");
			this.state = state;
		}
		public function getState():State
		{
			return state;
		}
		public function getPlayState():State
		{
			return this.playState;
		}
		public function getStopState():State
		{
			return this.stopState;
		}
	}
}
Код AS3:
package 
{
	//Play State
	// Класс контекстного состояния: состояние проигрывания
	class PlayState implements State
	{
		var videoWorks:VideoWorks;
		public function PlayState(videoWorks:VideoWorks)
		{
			trace("--Play State--");
			this.videoWorks = videoWorks;
		}
		public function startPlay():void
		{
			trace("You're already playing");
		}
		public function stopPlay():void
		{
			trace("Stop playing.");
			videoWorks.setState(videoWorks.getStopState());
		}
	}
}
Код AS3:
package 
{
	//Stop State;
	// Класс контекстного состояния: проигрывание остановлено
	class StopState implements State
	{
		// Доступ к методам установщикам и получателям для каждого состояния
		var videoWorks:VideoWorks;
 
		public function StopState(videoWorks:VideoWorks)
		{
			trace("--Stop State--");
			this.videoWorks = videoWorks;
		}
		public function startPlay():void
		{
			trace("Begin playing");
			videoWorks.setState(videoWorks.getPlayState());
		}
		public function stopPlay():void
		{
			trace("You're already stopped");
		}
	}
}
Код AS3:
package 
{
	//Test states
	// Тестируем состояния: Клиент
	import flash.display.Sprite;
	public class TestState extends Sprite
	{
		public function TestState( ):void
		{
			var test:VideoWorks = new VideoWorks( );
			test.startPlay( );
			test.startPlay( );
			test.stopPlay( );
			test.stopPlay( );
		}
	}
}

Старый 19.02.2013, 01:08
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 12  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Есть такой паттерн "состояние", да
Наверно делать с его помощью проигрыватель - не самая худшая идея - да.

Но куда Вы его в систему отмены/повтора впихнуть предлагаете?!

В редакторе есть еще непосредственно система редактирования, т.е. определения действий - там да, для переключения инструментов, состояния процесса редактирования всяко лучше свичей построить набор состояний.
Но здесь то речь про _применение_ и _отмену_ этих изменений.

Хочется видеть то не копипасту канонического примера из книги, а пример использования в данной задаче.

Старый 19.02.2013, 01:14
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 13  
Ответить с цитированием
yasha005
[+1 16.03.13]
[+1 22.03.13]

Регистрация: Dec 2012
Сообщений: 100
Цитата:
Сообщение от expl Посмотреть сообщение
Есть такой паттерн "состояние", да
Наверно делать с его помощью проигрыватель - не самая худшая идея - да.

Но куда Вы его в систему отмены/повтора впихнуть предлагаете?!

В редакторе есть еще непосредственно система редактирования, т.е. определения действий - там да, для переключения инструментов, состояния процесса редактирования всяко лучше свичей построить набор состояний.
Но здесь то речь про _применение_ и _отмену_ этих изменений.

Хочется видеть то не копипасту канонического примера из книги, а пример использования в данной задаче.
Вы расчитываете что кто-то за вас будет делать вашу работу? Мне думается врятли тут найдутся такие желающие. На самом деле данный шаблон можно впихнуть в любую реализацию где требуется переключение состояний в том числе и переключение инструментов: ведь в определённый момент времени юзается только один инструмент

Старый 19.02.2013, 01:23
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 14  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Вы расчитываете что кто-то за вас будет делать вашу работу?
У меня здесь какая-то работа появилась O_o

Я к чему это всё написал:
- Вы процитировали все мои слова про состояние редактируемых данных/графики (_не_ редактора!),
про его откат, про продходы сохранения изменений и сохранения всего состояния данных применительно к откатам.
- Потом привели пример паттерна "состояние" очень похожий на пример из книги "ActionScript 3.0. Шаблоны проектирования".
- Как применить этот шаблон к откатам совершенно не понятно
- Поэтому хочется увидеть как паттерн состояние работает внутри системы откатов/повторов (мне чисто из-за любопытства - ибо задачи в данный момент построить редактор не стоит)

Или Вы имели в виду только "переключение инструментов"?

Старый 19.02.2013, 01:25
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 15  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
На мой взгляд, самый надежный вариант позволяющий и усложнятся и макросы писать, и вообще переводит работу с редактором на новый уровень... это когда команды редактор выполняет не непосредственно, а через прослойку интерпретируемого языка (для сравнения, Vim и Emacs так примерно работают, CAD / Photoshop - похоже).
В таком случае пользователь работая с редактором пишет программу, которую потом можно и воспроизвести, и сохранить, или, например, есть вот такая штука (использую, очень нравится): http://www.emacswiki.org/emacs/UndoTree (т.е. можно хранить одновременно несколько веток изменений и потом выбирать какую именно использовать - гораздо круче, чем, когда один шаг undo + новая команда затирают десяток undo сделанных до того).
__________________
Hell is the possibility of sanity

Старый 19.02.2013, 01:34
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 16  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
это когда команды редактор выполняет не непосредственно, а через прослойку интерпретируемого языка
wvxvw, ведь для этого надо API навернуть на свою систему. Я даже для тестовых прогонов тутора в нашей игрушке не смог скрипт задействовать - слишком много вокруг as3-кода всё равно пишется, на самом as3 в разы проще.
Если макросы пользователю редактора не нужны, то какой в этом смысл?
Цитата:
можно хранить одновременно несколько веток изменений и потом выбирать какую именно использовать
Всегда думал, дойдет ли кто до такого - всётки дошли Но много ли в этом смысла без мержинга между ветками?
Хотя есть - скопипастить оттуда-отсюда.

Старый 19.02.2013, 01:57
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 17  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
В чем смысл:
Я вот сейчас "прохожу перепрофилировку" в "на все руки мастер (но восновмом, Руби, наверное, хочется верить, возможно, но пока нет, а в оставшееща время ПХП / АСП классик / Жабоскрипт и прилагающаяся муть)".

Возникают два типа штатных ситуаций:
- ХТМЛ - очень предательская технология, с напрочь отсутствующей логикой, где сносный результат достигается только бесконечным повтором попыток и ошибок. Работая с файлом приходитыся очень часто делать несколько изменений - потом проверять, потом недомуветь от результатов, потом возвращаться и переделывать, и так по многу раз. (Сегодня пару часов убил пытаясь понять почему у кнопки два раза срабатывает onclick - оказалось label рядом с кнопкой диспатчил каким-то образом событие в соседнюую кнопку...
- Жабоскрипт "программисты", наученные горьким опытом даже не ищут логику в происходящем, а руководствуются "джаваскрипт чутьем", которе им подсказывает, что и где поменять, чтобы "заработало". Иногда приходится просить помощи у старшего товарища, а потом, после того как "заработало", откатывать множество бесполезных изменений сделанных старшим товарищем.

ЗЫ. Мержить можно: ediff - сразу же и мержит, но до такой степени не доходило, пока.
__________________
Hell is the possibility of sanity

Старый 19.02.2013, 10:02
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 18  
Ответить с цитированием
yasha005
[+1 16.03.13]
[+1 22.03.13]

Регистрация: Dec 2012
Сообщений: 100
Цитата:
Сообщение от expl Посмотреть сообщение
...
В редакторе есть еще непосредственно система редактирования, т.е. определения действий - там да, для переключения инструментов, состояния процесса редактирования всяко лучше свичей построить набор состояний.
Но здесь то речь про _применение_ и _отмену_ этих изменений. ...
Это конечно хорошо, что техническое задание вы уже составили. Теперь давайте разберёмся как можно применить шаблон, а возможно и шаблоны проектирования к вашему техническому заданию.

Если вам всётаки интересно моё мнение каким образом я вижу данную реализацию в шаблоне:
В данном случае я вижу два состояния:
1. Переход на следующее дествие
2. Переход на предыдущее действие
А в качестве вспомогательного класса можно использовать класс реализованный на основе шаблона "Декоратор". Как вы помните из книжечки Декоратор добавляет объекту обязанностей. Он упаковывает его в свою новую функциональность и свойства, в то время как внутрення структура объекта остаётся неизменной.
Таким образом я предлагаю своего рода упаковывать каждое действие в новое действие, а чтобы не возникло путаницы является ли это новым действием или отменой действий, за это как раз и будет отвечать основная реализация Состояния.

Старый 19.02.2013, 10:33
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 19  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Цитата:
Сообщение от yasha005 Посмотреть сообщение
Это конечно хорошо, что техническое задание вы уже составили. Теперь давайте разберёмся как можно применить шаблон, а возможно и шаблоны проектирования к вашему техническому заданию.
Знатно троллите expl

Старый 19.02.2013, 10:54
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 20  
Ответить с цитированием
yasha005
[+1 16.03.13]
[+1 22.03.13]

Регистрация: Dec 2012
Сообщений: 100
Цитата:
Сообщение от zuxul Посмотреть сообщение
Знатно троллите expl
Напрасно вы так думаете, с моей стороны - вполне конструктивный совет. А способ его релизации уже зависит от фантазии и понимании самих шаблонов.

Я считаю as3 достаточно гибким языком, потому как можно реализовать сию конструкцию не только расширением наследования классов и расширением реализации интерфейсов, но и передачи самого класса в экземпляр другого класса посредством ключевого слова this

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

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

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


 


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


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