Отмена — это метод взаимодействия, реализованный во многих компьютерных программах. Он стирает последнее изменение, внесенное в документ, возвращая его к более раннему состоянию. В некоторых более продвинутых программах, таких как графическая обработка , отмена отменяет последнюю команду, выполненную в редактируемом файле. Благодаря возможности отмены пользователи могут исследовать и работать, не боясь совершить ошибки, поскольку их можно легко отменить.
Ожидания от отмены легко понять: иметь предсказуемую функциональность и включать все «отменяемые» команды. [1] Обычно отмена доступна до тех пор, пока пользователь не отменит все выполненные операции. Но есть некоторые действия, которые не сохраняются в списке отмены, и поэтому их нельзя отменить. Например, сохранить файл нельзя, но оно ставится в очередь в списке, чтобы показать, что оно было выполнено. Другое действие, которое обычно не сохраняется и, следовательно, не может быть отменено, — это прокрутка или выбор . [2]
Противоположностью отмене является повтор . Команда повтора отменяет отмену или перемещает буфер в более позднее состояние.
Общими компонентами функции отмены являются команды , которые были выполнены пользователем, буфер(ы) истории , в которых хранятся выполненные действия, менеджер отмены/повтора для управления буфером истории и пользовательский интерфейс для взаимодействия с пользователем. [3]
В большинстве графических приложений для большинства основных операционных систем (таких как Microsoft Windows , Linux и BSD ) сочетание клавиш для команды отмены — Ctrl+Z или Alt+Backspace, а сочетание клавиш для повтора — Ctrl+Y или Ctrl + Shift +Z. В большинстве приложений macOS сочетание клавиш для команды отмены — Command -Z, а сочетание клавиш для повтора — Command - Shift -Z. На всех платформах функции отмены/повтора также доступны через меню «Правка» .
Возможность отмены операции на компьютере была независимо изобретена несколько раз в ответ на то, как люди использовали компьютеры. [4]
Система поиска и редактирования файлов , разработка которой началась в 1968 году в Университете Брауна , считается первой компьютерной системой, имеющей функцию «отмены». [5] [6]
К 1971 году Уоррен Тейтельман разработал помощника программиста как часть BBN-LISP с функцией отмены. [7]
В текстовом редакторе Xerox PARC Bravo в 1974 году появилась команда «Отменить». [8] В исследовательском отчете 1976 года Лэнса А. Миллера и Джона К. Томаса из IBM « Поведенческие проблемы при использовании интерактивных систем » [9] отмечалось, что «было бы весьма полезно разрешить пользователям «отменять» хотя бы непосредственно предыдущую команду (путем ввода специальной команды «Отменить»)». [10] Программисты исследовательского центра Xerox PARC назначили сочетание клавиш Ctrl-Z для команды «Отменить», что стало важнейшей функцией текстовых редакторов и текстовых процессоров в эпоху персональных компьютеров . [11] В 1980 году Ларри Теслер из Xerox PARC начал работать в Apple Computer . Там он и Билл Аткинсон выступали за наличие команды «Отменить» в качестве стандартного приспособления в Apple Lisa . Аткинсону удалось убедить отдельных разработчиков программного обеспечения для Lisa включить единый уровень отмены и повтора, но ему не удалось лоббировать необходимость нескольких уровней. [ необходима цитата ] Когда Apple представила преемника Lisa, Macintosh , она поставила условие, что все стандартные приложения должны включать «Отменить» в качестве первой команды в меню «Правка» [12] , что остается стандартом в macOS и Windows по сей день.
Многоуровневые команды отмены были введены в 1980-х годах, позволяя пользователям отменять ряд действий, а не только самое последнее. [11] EMACS и другие редакторы с разделением времени имели их до программного обеспечения для персональных компьютеров. CygnusEd был первым текстовым редактором Amiga с неограниченной функцией отмены/возврата. AtariWriter , приложение для обработки текста, представленное в 1982 году, имело функцию отмены. NewWord, еще одна программа для обработки текста, выпущенная NewStar в 1984 году, имела команду отмены стирания. [11] VisiWord от IBM также имела команду отмены удаления.
Модели отмены можно разделить на линейные и нелинейные. Нелинейная модель отмены может быть подразделена на модель сценария, модель us&r, триадическую модель и выборочную отмену. [1]
Некоторые общие свойства моделей:
Линейная отмена реализована с помощью стека (структура данных «последний пришел первым вышел» (LIFO)), в которой хранится история всех выполненных команд. Когда выполняется новая команда, она добавляется в начало стека. Таким образом, только последняя выполненная команда может быть отменена и удалена из истории. Отмену можно повторять до тех пор, пока история не станет пустой. [1]
Ограниченная линейная модель является расширением линейной модели отмены. Она удовлетворяет описанному выше свойству стабильного выполнения для линейной отмены, поскольку эта модель не сохраняет свойство, если команда выполнена, пока список истории содержит другие команды. Ограниченная линейная модель очищает список истории перед добавлением новой команды. Но доступны и другие ограничения. Например, размер списка истории может быть ограничен или при достижении определенного размера первая выполненная команда удаляется из списка. [1]
Главное отличие линейной отмены от нелинейной заключается в возможности пользователя отменять выполненные команды в произвольном порядке. У них есть возможность отменить не последнюю команду, а выбрать команду из списка. [3] Для нелинейной модели существуют подклассы, реализующие эту модель.
Модель сценария обрабатывает действия пользователя как редактирование сценария команд. Список истории выполненных команд интерпретируется «как сценарий, эффект отмены определяется как такой же, как если бы отмененное действие никогда не происходило изначально». [1] В результате отмены состояние должно быть таким, как если бы отмененная команда никогда не выполнялась. Недостатком этой модели является то, что пользователь должен знать связь между отмененной командой и текущим состоянием, чтобы избежать побочных эффектов. Одним из них может быть, например, дублирование. Другие проблемы заключаются в том, что если «последующие команды переделываются в другом состоянии, в котором они были изначально выполнены в интерфейсах прямого манипулирования, эта переинтерпретация исходного действия пользователя не всегда очевидна или хорошо определена». [1]
Особенностью этой модели является то, что она имеет возможность пропуска команды. Это означает, что повторение команды может быть пропущено. Пропущенная команда помечается как пропущенная, но не удаляется. При выполнении новых команд список истории сохраняется, поэтому порядок выполненных команд может быть воспроизводимым с его помощью. Порядок можно описать с помощью дерева истории, которое представляет собой направленный граф, «потому что можно продолжать повторять команды из другой ветви, создавая ссылку в графе». [1] Несмотря на то, что набор команд прост и понятен, сложная структура с пропуском и связыванием ветвей сложна для понимания и запоминания, когда пользователь хочет отменить более одного шага. [1]
Эта нелинейная модель отмены имеет помимо отмены и повтора возможность поворота. Она имеет ту же структуру данных, что и вышеупомянутые модели, со списком истории и отдельным списком повтора, который включает операции повтора. Операция поворота устанавливает последнюю команду списка повтора перед собой. С одной стороны, это означает, что следующую команду для повтора можно выбрать, поместив ее впереди. С другой стороны, поворот можно использовать «для выбора места в списке повтора, куда следующая операция отмены поместит команду». [1] Таким образом, список повтора неупорядочен. «Чтобы отменить изолированную команду, пользователь должен отменить несколько шагов, повернуть список повтора, а затем повторить несколько шагов». [1] Для повтора список должен быть повернут до тех пор, пока требуемая команда не окажется выше.
Якубек и др. говорят, что выборочная отмена — это функция, которую может предложить модель, но для выборочной отмены нет четкого определения. [3] Авторы выбрали функции, которые должна иметь модель, когда она поддерживает выборочную отмену. Должна быть возможность «отменять любое выполненное действие в буфере истории. Действия, не зависящие от отменяемого действия, должны оставаться нетронутыми». [3] Точно так же должен быть возможен повтор для любой отмененной команды. Третья функция выборочной отмены заключается в том, что «никакая команда не может быть автоматически отброшена из буфера истории без прямого запроса пользователя». [3] Для выборочной отмены применяется отмена и повтор, которые могут быть выполнены вне любого контекста. Есть три основных проблемы. Первая заключается в том, что отмененные команды могут находиться вне исходного контекста. Из-за этого могут быть мертвые ссылки, которые необходимо обработать. Вторая проблема заключается в том, что измененные команды могут быть отменены, и поэтому необходимо решить, какое состояние будет представлено после отмены. Третья проблема заключается в проблемах с отбрасыванием команд. Выборочная отмена не имеет указателя в списках, поэтому это означает, что ни одна команда не должна быть отброшена из стека. [3]
Прямая выборочная отмена — это расширение ограниченной линейной отмены с деревом истории. Операция создает копию выбранной команды, выполняет ее и добавляет в список истории. Определены две нелинейные операции выборочная отмена и выборочный повтор, поэтому она более симметрична. [1]
Когда несколько пользователей могут редактировать один и тот же документ одновременно, требуется многопользовательская отмена. Глобальная многопользовательская отмена отменяет последнее действие, выполненное с документом, независимо от того, кто выполнил редактирование. Локальная многопользовательская отмена отменяет только действия, выполненные локальным пользователем, что требует нелинейной реализации отмены.
Если отмена может использоваться для возврата к нескольким изменениям, команда повтора перемещается вперед по истории действий. Создание новой правки обычно очищает список повторов. Если используется ветвящаяся модель повтора, новая правка разветвляет историю действий.
Количество предыдущих действий, которые можно отменить, зависит от программы, версии и возможностей оборудования или программного обеспечения. Например, размер стека отмены/повтора по умолчанию в Adobe Photoshop составляет 20, но пользователь может изменить его. В качестве другого примера, более ранние [ когда? ] версии Microsoft Paint позволяли отменять только до трех правок; версия, представленная в Windows 7, увеличила этот предел до 50.
Упрощенные функции отмены единичного редактирования иногда обходятся без «повтора», рассматривая саму команду отмены как действие, которое можно отменить. Это известно как модель переворота отмены, поскольку пользователь может переключаться между двумя состояниями программы с помощью команды отмены. [13] Это была стандартная модель до широкого внедрения многоуровневой отмены в начале 1990-х годов.
Отмена может быть реализована с помощью различных шаблонов. Наиболее распространенными шаблонами являются шаблон команды и шаблон памяти .
Шаблон команды — это шаблон проектирования программного обеспечения , который инкапсулирует информацию из операции в объекты команды. Это означает, что каждое действие хранится в объекте. Абстрактный класс команды реализует абстрактную операцию выполнения, поэтому каждый объект команды имеет операцию выполнения. Для отмены также должна быть невыполненная операция, которая отменяет эффект выполненной команды, которые хранятся в списке истории. Отмена и повтор реализованы таким образом, что список просматривается вперед и назад при вызове команды выполнения или отмены выполнения. [14]
Для одиночной отмены сохраняется только выполненная команда. В отличие от многоуровневой отмены, где сохраняется не только список истории с командами, но и количество уровней отмены может быть определено из максимальной длины списка. [14]
С шаблоном memento сохраняется внутреннее состояние объекта. Объект, в котором сохраняется состояние, называется memento и организован через создателя memento. Это возвращает memento, инициализированное информацией о текущем состоянии, когда выполняется отмена, так что состояние может быть проверено. Memento видно только создателю.
В шаблоне memento механизм отмены называется хранителем. Он отвечает за сохранность mementos, но никогда не меняет их содержимое. Для отмены хранитель запрашивает memento у создателя, а затем применяет отмену. [14]
Большая часть механизма отмены может быть реализована без зависимости от конкретных приложений или классов команд. Это включает в себя «управление списком истории, скроллер истории, пункты меню для отмены и повтора и обновление пунктов меню в зависимости от имени следующей доступной команды». [1]
Каждый класс команд имеет метод do, который вызывается при выполнении команды. Метод undo реализует обратную операцию метода do. Для реализации обратного действия существует несколько различных стратегий.
Но самой популярной разработкой для начинающих пользователей FRESS была не его способность вмещать несколько дисплеев и пользователей; это была функция «отмены» — функция, которой ван Дам больше всего гордится (ван Дам 2011). FRESS стал пионером одноуровневой отмены как для обработки текста, так и для гипертекста. Каждое редактирование файла сохранялось в теневой версии структуры данных, что позволяло как «автосохранение», так и отмену. Сотрудники и студенты Брауна сразу поняли важность и полезность этой функции (ван Дам 1999).