Шаблон разработки для механизма Отмены

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
116
задан Ozgur Ozcitak 22 July 2014 в 10:32
поделиться

16 ответов

Большинство примеров, которые я видел, использует вариант Шаблон "команда" для этого. Каждое пользовательское действие это невыполнимо, заставляет свой собственный экземпляр команды со всей информацией выполнять действие и откатывать его. Можно тогда вести список всех команд, которые были выполнены, и можно откатывать их один за другим.

87
ответ дан E-rich 24 November 2019 в 02:17
поделиться

Первый раздел Шаблонов разработки (GoF, 1994) имеет вариант использования для реализации отмены/восстановления как шаблон разработки.

0
ответ дан Peter Turner 24 November 2019 в 02:17
поделиться

Я когда-то работал над приложением, в котором все изменения, внесенные командой в модель приложения (т.е. CDocument..., мы использовали MFC), были сохранены в конце команды путем обновления полей во внутренней базе данных, сохраняемой в рамках модели. Таким образом, мы не должны были писать отдельный код отмены/восстановления для каждого действия. Стек отмены просто помнил первичные ключи, имена полей и старые значения каждый раз, когда запись была изменена (в конце каждой команды).

0
ответ дан Agnel Kurian 24 November 2019 в 02:17
поделиться

Я должен был сделать это при записи решателя для головоломки перехода штепселя. Я сделал каждое перемещение Объектом команды, который содержал достаточно информации, что это могло быть или сделано или отменено. В моем случае это было столь же просто как хранение стартовой позиции и направления каждого перемещения. Я тогда хранил все эти объекты в стеке, таким образом, программа могла легко отменить столько перемещений, сколько ей было нужно при отслеживании в обратном порядке.

1
ответ дан Bill the Lizard 24 November 2019 в 02:17
поделиться

Мы снова использовали загрузку файла, и сохраните код сериализации для “objects” для удобной формы, чтобы сохранить и восстановить все состояние объекта. Мы продвигаем те сериализованные объекты на стеке отмены †“наряду с некоторой информацией о том, какая операция была выполнена и подсказки при отмене той операции, если там isn’t достаточно информации подобрал из сериализированных данных. Отмена и Восстановление часто просто заменяют один объект другим (в теории).

были много МНОГО ошибок из-за указателей (C++) к объектам, которые никогда не фиксировались, поскольку Вы выполняете некоторые нечетные последовательности восстановления отмены (те места, не обновленные к более безопасной отмене осведомленный “identifiers”). Ошибки в этой области часто... ummm... интересный.

Некоторые операции могут быть особыми случаями для скорости/использования ресурсов - как калибровка вещей, переместив вещи.

Мультивыбор обеспечивает некоторые интересные сложности также. Luckly у нас уже было группирующееся понятие в коде. Комментарий Kristopher Johnson о подэлементах достаточно близок к тому, что мы делаем.

1
ответ дан Aardvark 24 November 2019 в 02:17
поделиться

Для ссылки вот простая реализация Шаблона "команда" для Отмены/Восстановления в C#: Простая система отмены/восстановления для C#.

2
ответ дан sg7 24 November 2019 в 02:17
поделиться

Большинство примеров, которые я считал, делает это или при помощи шаблона "команда" или при помощи шаблона "memento". Но можно сделать это без шаблонов разработки также с простым структура двухсторонней очереди .

2
ответ дан Patrik Svensson 24 November 2019 в 02:17
поделиться

Я с Mendelt Siebenga на том, что необходимо использовать Шаблон "команда". Шаблоном, который Вы использовали, был Шаблон "memento", который может и становиться очень расточительным со временем.

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

я советовал бы проверить, существует ли платформа, которая уже создала модель для неDOS на языке программирования / платформа по Вашему выбору. Хорошо изобрести новый материал, но лучше взять что-то уже записанное, отлаженное и протестированное в реальных сценариях. Помогло бы, добавили ли Вы, в чем Вы пишете это, таким образом, люди могут рекомендовать платформы, они знают.

4
ответ дан Community 24 November 2019 в 02:17
поделиться

Просто чтение о шаблоне "команда" в моей книге гибкой разработки - возможно, это имеет потенциал?

у Вас может быть каждая реализация команды интерфейс команды (который имеет Выполнение () метод). Если Вы хотите отмену, можно добавить метод Отмены.

[еще 113] информация здесь

5
ответ дан Dave Arkell 24 November 2019 в 02:17
поделиться

Я реализовал сложные системы отмены успешно с помощью Шаблона "memento" - очень легкий, и обладает преимуществом естественного служения основой Восстановления также. Более тонкое преимущество - то, что совокупные действия могут содержаться в рамках единственной Отмены также.

, Короче говоря у Вас есть две стопки объектов сувенира. Один для Отмены, другого для Восстановления. Каждая операция создает новый сувенир, который идеально будет некоторыми вызовами для изменения состояния модели, документа (или безотносительно). Это добавляется к стеку отмены. Когда Вы делаете операция отмены, в дополнение к выполнению действия Отмены с Сувениром возражают для возврата модели снова, Вы также выталкиваете объект от Стека отмены и продвигаете его прямо на Стек повторного выполнения.

то, Как метод для изменения состояния документа реализован, зависит полностью от реализации. Если можно просто заставить вызов API (например, ChangeColour (r, g, b)), затем предшествовать ему с запросом, чтобы получить и сохранить соответствующее состояние. Но шаблон будет также поддерживать создание, глубоко копирует, снимки памяти, временное создание файла и т.д. - это - все до Вас, как это, просто виртуальная реализация метода.

, Чтобы сделать совокупные действия (например, пользовательский Shift-Selects загрузка объектов сделать операцию на, те, которые удаляют, переименовывают, атрибут изменения), Ваш код создает новый Стек отмены как единственный сувенир и передачи это к фактической операции для добавления отдельных операций к. Таким образом, Ваши методы действия не должны (a) иметь глобального стека для волнения об и (b) может быть кодирован то же, выполняются ли они в изоляции или как часть одной совокупной операции.

Много систем отмены в оперативной памяти только, но Вы могли сохранить стек отмены, при необходимости я предполагаю.

6
ответ дан Greg Whitfield 24 November 2019 в 02:17
поделиться

Это могло бы быть случаем, где CSLA применим. Это было разработано для оказания сложной поддержки отмены объектам в приложениях Windows Forms.

7
ответ дан Eric Z Beard 24 November 2019 в 02:17
поделиться

Вы могли бы хотеть обратиться к код Paint.NET для их отмены - у них есть действительно хорошая система отмены. Это, вероятно, немного более просто, чем, в чем Вы будете нуждаться, но это могло бы дать некоторое представление Вам и инструкциям.

-Adam

8
ответ дан Adam Davis 24 November 2019 в 02:17
поделиться

Как другие заявили, шаблон "команда" является очень мощным методом реализации Отмены/Восстановления. Но существует важное преимущество, которое я хотел бы упомянуть шаблону "команда".

При реализации отмены/восстановления с помощью шаблона "команда", можно избежать больших сумм дублированного кода путем абстракции (в известной степени) операций, выполненных на данных, и использовать те операции в системе отмены/восстановления. Например, в вырезанном и вставленном текстовом редакторе дополнительные команды (кроме управления буфером обмена). Другими словами, операция отмены для сокращения является вставкой, и операция отмены для вставки сокращается. Это относится к намного более простым операциям как к вводящему и удаляющему тексту.

ключ здесь - то, что можно использовать систему отмены/восстановления в качестве основной системы команд для редактора. Вместо того, чтобы писать систему те, которые "создают объект отмены, измените документ", можно "создать объект отмены, выполнить операцию восстановления на объекте отмены изменить документ".

Теперь, по общему признанию, многие люди думают себе "Хорошо понятное дело, не часть точки шаблона "команда"?" Да, но я видел слишком много систем команд, которые имеют два набора команд, один для непосредственных операций и другого набора для отмены/восстановления. Я не говорю, что не будет команд, которые характерны для непосредственных операций и отмены/восстановления, но сокращение дублирования сделает код более удобным в сопровождении.

15
ответ дан Torlack 24 November 2019 в 02:17
поделиться

Если Вы говорите GoF, Сувенир , шаблон конкретно обращается к отмене.

17
ответ дан Andy Whitfield 24 November 2019 в 02:17
поделиться

Я думаю, что и сувенир и команда не практичны, когда Вы имеете дело с моделью размера и объема, который подразумевает OP. Они работали бы, но это будет большая работа, чтобы поддержать и расшириться.

Для этого типа проблемы, я думаю, что необходимо создать в поддержке модели данных для поддержки дифференциальных контрольных точек для каждый объект вовлеченный в модель. Я сделал это однажды, и это работало очень гладкое. Самая большая вещь, которую необходимо сделать, избегают прямого использования указателей или ссылок в модели.

Каждая ссылка на другой объект использует некоторый идентификатор (как целое число). Каждый раз, когда объект необходим, Вы поиск текущее определение объекта от таблицы. Таблица содержит связанный список для каждого объекта, который содержит все предыдущие версии, наряду с информацией, относительно которой контрольной точки они были активны для.

отмена/восстановление Реализации проста: Сделайте свое действие и установите новую контрольную точку; откатывайте все версии объекта к предыдущей контрольной точке.

Это берет некоторую дисциплину в коде, но имеет много преимуществ: Вам не нужны глубокие копии, так как Вы делаете дифференциальное устройство хранения данных образцового состояния; можно определить объем объема памяти, который Вы хотите использовать ( очень важный для вещей как Модели CAD) или количеством восстановлений или используемой памятью; очень масштабируемые и низкие эксплуатационные расходы для функций, которые воздействуют на модель, так как они не должны делать ничего для реализации отмены/восстановления.

32
ответ дан Jeff Kotula 24 November 2019 в 02:17
поделиться

Проект Codeplex :

Это простой фреймворк для добавления функциональности Undo / Redo в ваши приложения, основанный на классическом шаблоне проектирования Command. Он поддерживает действия слияния, вложенные транзакции, отложенное выполнение (выполнение при фиксации транзакции верхнего уровня) и возможную нелинейную историю отмены (где вы можете выбрать несколько действий для повторения).

3
ответ дан 24 November 2019 в 02:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: