Показать сообщение отдельно
Старый 19.02.2013, 00:40
yasha005 вне форума Посмотреть профиль Отправить личное сообщение для yasha005 Найти все сообщения от yasha005
  № 7  
Ответить с цитированием
yasha005

Регистрация: 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( );
		}
	}
}