Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Undo/Redo Manager - как лучше сделать ? (http://www.flasher.ru/forum/showthread.php?t=194611)

yasha005 19.02.2013 00:40

Цитата:

Сообщение от expl (Сообщение 1121161)
Чем тогда это отличается от 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( );
                }
        }
}


expl 19.02.2013 01:08

Есть такой паттерн "состояние", да
Наверно делать с его помощью проигрыватель - не самая худшая идея - да.

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

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

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

yasha005 19.02.2013 01:14

Цитата:

Сообщение от expl (Сообщение 1121215)
Есть такой паттерн "состояние", да
Наверно делать с его помощью проигрыватель - не самая худшая идея - да.

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

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

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

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

expl 19.02.2013 01:23

Цитата:

Вы расчитываете что кто-то за вас будет делать вашу работу?
У меня здесь какая-то работа появилась O_o

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

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

wvxvw 19.02.2013 01:25

На мой взгляд, самый надежный вариант позволяющий и усложнятся и макросы писать, и вообще переводит работу с редактором на новый уровень... это когда команды редактор выполняет не непосредственно, а через прослойку интерпретируемого языка (для сравнения, Vim и Emacs так примерно работают, CAD / Photoshop - похоже).
В таком случае пользователь работая с редактором пишет программу, которую потом можно и воспроизвести, и сохранить, или, например, есть вот такая штука (использую, очень нравится): http://www.emacswiki.org/emacs/UndoTree (т.е. можно хранить одновременно несколько веток изменений и потом выбирать какую именно использовать - гораздо круче, чем, когда один шаг undo + новая команда затирают десяток undo сделанных до того).

expl 19.02.2013 01:34

Цитата:

это когда команды редактор выполняет не непосредственно, а через прослойку интерпретируемого языка
wvxvw, ведь для этого надо API навернуть на свою систему. Я даже для тестовых прогонов тутора в нашей игрушке не смог скрипт задействовать - слишком много вокруг as3-кода всё равно пишется, на самом as3 в разы проще.
Если макросы пользователю редактора не нужны, то какой в этом смысл?
Цитата:

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

wvxvw 19.02.2013 01:57

В чем смысл:
Я вот сейчас "прохожу перепрофилировку" в "на все руки мастер (но восновмом, Руби, наверное, хочется верить, возможно, но пока нет, а в оставшееща время ПХП / АСП классик / Жабоскрипт и прилагающаяся муть)".

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

ЗЫ. Мержить можно: ediff - сразу же и мержит, но до такой степени не доходило, пока.

yasha005 19.02.2013 10:02

Цитата:

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

Это конечно хорошо, что техническое задание вы уже составили. Теперь давайте разберёмся как можно применить шаблон, а возможно и шаблоны проектирования к вашему техническому заданию.

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

zuxul 19.02.2013 10:33

Цитата:

Сообщение от yasha005 (Сообщение 1121246)
Это конечно хорошо, что техническое задание вы уже составили. Теперь давайте разберёмся как можно применить шаблон, а возможно и шаблоны проектирования к вашему техническому заданию.

Знатно троллите expl :taunt:

yasha005 19.02.2013 10:54

Цитата:

Сообщение от zuxul (Сообщение 1121247)
Знатно троллите expl :taunt:

Напрасно вы так думаете, с моей стороны - вполне конструктивный совет. А способ его релизации уже зависит от фантазии и понимании самих шаблонов.

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


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

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