
アンドゥは、多くのコンピュータプログラムに実装されている操作方法です。ドキュメントに加えられた最後の変更を消去し、以前の状態に戻します。グラフィック処理などのより高度なプログラムでは、アンドゥは編集中のファイルに対して行われた最後のコマンドを無効にします。アンドゥ機能のおかげで、[ 1 ]ユーザーは間違いを恐れることなく探索や作業を行うことができます。なぜなら、間違いは簡単に元に戻せるからです。
アンドゥに対する期待は理解しやすいものです。予測可能な機能を持ち、すべての「アンドゥ可能な」コマンドが含まれていることです。[ 2 ]通常、アンドゥはユーザーが実行したすべての操作を取り消すまで利用できます。しかし、アンドゥリストに保存されないアクションもあり、そのため取り消すことができません。たとえば、ファイルの保存は取り消すことはできませんが、実行されたことを示すためにリストにキューイングされます。通常保存されないため取り消すことができないもう1つのアクションは、スクロールまたは選択です。[ 3 ]
元に戻す操作の反対はやり直し操作です。やり直しコマンドは、元に戻す操作を取り消すか、バッファをより最近の状態に戻します。
アンドゥ機能の共通コンポーネントは、ユーザーが実行したコマンド、完了したアクションを保存する履歴バッファ、履歴バッファを制御するアンドゥ/リドゥマネージャ、およびユーザーと対話するためのユーザーインターフェイスです。 [ 4 ]
主要なオペレーティングシステム( Microsoft Windows、Linux、BSDなど)のほとんどのグラフィカルアプリケーションでは、元に戻すためのキーボードショートカットはCtrl「+Z」、やり直しのためのショートカットは「+」または「++ 」です。macOSのほとんどのアプリケーションでは、元に戻すコマンドのショートカットは「+」、やり直しのためのショートカットは「++ 」です。すべてのプラットフォームで、元に戻す/やり直し機能は「編集」メニューからもアクセスできます。CtrlYCtrl⇧ ShiftZ⌘ CommandZ⌘ Command⇧ ShiftZ
コンピュータ上での操作を取り消す機能は、人々がコンピュータを使用する方法に応じて、複数回独立して発明された。[ 5 ]
1968年にブラウン大学で開発が始まったファイル検索編集システムは、 「元に戻す」機能を備えた最初のコンピュータベースのシステムであると報告されている。[ 6 ] [ 7 ]
ウォーレン・タイテルマンは、 1971年までにBBN-LISPの一部としてアンドゥ機能を備えたプログラマーアシスタントを開発した。 [ 8 ]
マービン・ゼルコウィッツは、 1971年にコーネル大学で提出した博士論文(診断ツールとしての可逆実行)の中で、本質的にはアンドゥである可逆実行の概念を提唱した。アラン・M・デイビスは、1975年にイリノイ大学アーバナ・シャンペーン校で提出した博士論文(実行時エラーのための対話型分析システム)の中で、ゼルコウィッツの概念を拡張し、マルチレベルのアンドゥ(すなわち、マルチレベルの可逆実行)がソフトウェアプログラムのデバッグにどのように利用できるかを示した。
Xerox PARC Bravoテキスト エディタには 1974 年に Undo コマンドがありました。[ 9 ] IBM の Lance A. Miller と John C. Thomas による 1976 年の調査レポート「対話型システムの使用における行動上の問題」[ 10 ]では、「ユーザーが少なくとも直前のコマンドを (特別な「undo」コマンドを発行することによって) 取り消すことができるようにすることは非常に有用である」と指摘されています。[ 11 ] Xerox PARC研究センターのプログラマーは、キーボード ショートカット Ctrl-Z を undo コマンドに割り当て、これはパーソナル コンピュータ時代のテキスト エディタやワード プロセッサの重要な機能となりました。[ 12 ] 1980 年に、 Xerox PARC のLarry Tesler がApple Computerで働き始めました。そこで、彼とBill Atkinson は、Apple Lisaに undo コマンドを標準装備として搭載することを提唱しました。アトキンソンは、Lisaのアプリケーションソフトウェアの個々の開発者を説得して、1段階の元に戻すとやり直し機能を含めることには成功したが、複数段階の機能を求めるロビー活動は成功しなかった。AppleがLisaの後継機であるMacintoshを発表した際、すべての標準アプリケーションに「編集」メニューの最初のコマンドとして「元に戻す」を含めることを規定した[ 13 ] 。これは今日までmacOSとWindowsの標準となっている。
1980年代には、複数レベルの元に戻すコマンドが導入され、ユーザーは最新の操作だけでなく、一連の操作を取り消すことができるようになりました。[ 12 ] EMACSやその他のタイムシェアリングスクリーンエディタは、パーソナルコンピュータソフトウェアよりも先にこの機能を備えていました。CygnusEdは、無制限の元に戻す/やり直し機能を備えた最初のAmigaテキストエディタでした。1982年に導入されたワードプロセッシングアプリケーションであるAtariWriterには、元に戻す機能がありました。1984年にNewStarからリリースされた別のワードプロセッシングプログラムであるNewWordには、削除解除コマンドがありました。[ 12 ] IBMのVisiWordにも削除解除コマンドがありました。
アンドゥモデルは、線形または非線形に分類できます。非線形アンドゥモデルは、スクリプトモデル、US&Rモデル、トライアディックモデル、選択的アンドゥに細分類できます。[ 2 ]
モデルの一般的な特性には以下のようなものがあります。
線形アンドゥは、実行されたすべてのコマンドの履歴を格納するスタック(後入れ先出し(LIFO)データ構造)を使用して実装されます。新しいコマンドが実行されると、スタックの先頭に追加されます。したがって、最後に実行されたコマンドのみをアンドゥして履歴から削除できます。履歴が空でない限り、アンドゥを繰り返すことができます。[ 2 ]
制限付き線形モデルは、線形アンドゥモデルの拡張です。このモデルは、履歴リストに他のコマンドが含まれている間にコマンドが実行された場合、上記の線形アンドゥの安定実行特性を維持しないため、上記の安定実行特性を満たします。制限付き線形モデルは、新しいコマンドが追加される前に履歴リストをクリアします。しかし、他の制限も利用可能です。たとえば、履歴リストのサイズを制限したり、定義されたサイズに達したときに、最初に実行されたコマンドをリストから削除したりできます。[ 2 ]
線形アンドゥと非線形アンドゥの主な違いは、ユーザーが実行したコマンドを任意の順序でアンドゥできるかどうかです。ユーザーは、最新のコマンドではなく、リストからコマンドを選択してアンドゥすることができます。[ 4 ]非線形モデルには、このモデルを実装するサブクラスがあります。
スクリプトモデルでは、ユーザー操作をコマンドのスクリプトの編集として扱います。実行されたコマンドの履歴リストは「スクリプトとして解釈され、元に戻す効果は、元に戻された操作がそもそも発生しなかった場合と同じであると定義されます。」[ 2 ]元に戻す結果として、状態は元に戻されたコマンドが実行されなかった場合と同じ状態である必要があります。このモデルの欠点は、副作用を避けるために、ユーザーが元に戻されたコマンドと現在の状態との関連性を知っておく必要があることです。その1つとして、重複が考えられます。その他の問題としては、「後続のコマンドが、直接操作インターフェースで最初に実行された状態とは異なる状態でやり直される場合、元のユーザー操作のこの再解釈は必ずしも明確または明確に定義されていない」ことが挙げられます。[ 2 ]
このモデルの特別な機能は、コマンドをスキップするオプションがあることです。つまり、コマンドのやり直しをスキップできます。スキップされたコマンドはスキップ済みとしてマークされますが、削除はされません。新しいコマンドが実行されると、履歴リストが保持されるため、実行されたコマンドの順序を再現できます。順序は、有向グラフである履歴ツリーで記述できます。「別のブランチからコマンドのやり直しを続けることができ、グラフにリンクが作成されるため」です。[ 2 ]コマンドのセットはシンプルで理解しやすいものの、スキップやリンクブランチを含む複雑な構造は、ユーザーが複数のステップを元に戻したい場合に理解し、記憶するのが困難です。[ 2 ]
この非線形アンドゥモデルは、アンドゥとリドゥに加えて回転機能も備えています。データ構造は、前述のモデルと同じで、履歴リストと、リドゥ操作を含む分離されたリドゥリストがあります。回転操作では、リドゥリストの最後のコマンドをその前に配置します。一方では、これは、次にリドゥするコマンドを前に配置することで選択できることを意味します。他方では、回転は「リドゥリスト内で、次のアンドゥ操作でコマンドを配置する場所を選択する」ために使用できます。[ 2 ]したがって、リドゥリストは順不同です。「個別のコマンドをアンドゥするには、ユーザーはいくつかのステップをアンドゥし、リドゥリストを回転させ、次にいくつかのステップをリドゥする必要があります。」[ 2 ]リドゥするには、目的のコマンドが上になるまでリストを回転させる必要があります。
Jakubec らは、選択的元に戻す機能はモデルが提供できる機能だが、選択的元に戻すには明確な定義がないと述べている。[ 4 ]著者らは、モデルが選択的元に戻すをサポートする際に持つべき機能を選択している。履歴バッファで実行されたアクションは元に戻せる必要がある。元に戻されるアクションとは無関係なアクションはそのままにしておく必要がある。[ 4 ]同様に、元に戻されたコマンドに対してはやり直しも可能でなければならない。選択的元に戻すための 3 番目の機能は、「ユーザーの直接の要求なしに、履歴バッファからコマンドを自動的に破棄することはできない」ことである。[ 4 ]選択的元に戻すには、元に戻すとやり直しがどのコンテキスト外でも実行可能であることが必要である。主な問題は 3 つある。1 つ目は、元に戻されたコマンドが元のコンテキスト外にある可能性があることである。これにより、処理する必要のあるデッド リファレンスが存在する可能性がある。2 つ目の問題は、変更されたコマンドを元に戻すことができるため、元に戻した後にどの状態を表示するかを解決する必要があることである。3 つ目の問題は、破棄コマンドの問題である。選択的アンドゥにはリストにポインタがないため、スタックからコマンドが破棄されるべきではないことを意味します。[ 4 ]
直接選択的アンドゥは、履歴ツリーを備えた制限付き線形アンドゥの拡張です。この操作では、選択したコマンドのコピーを作成し、それを実行して履歴リストに追加します。選択的アンドゥと選択的リドゥという2つの非線形操作が定義されているため、より対称的です。[ 2 ]
複数のユーザーが同時に同じドキュメントを編集できる場合、マルチユーザーアンドゥ機能が必要です。グローバルマルチユーザーアンドゥは、誰が編集を行ったかに関わらず、ドキュメントに対して行われた最新の操作を元に戻します。ローカルマルチユーザーアンドゥは、ローカルユーザーが行った操作のみを元に戻すため、非線形アンドゥの実装が必要となります。
アンドゥ機能では複数の編集を遡って元に戻すことができますが、リドゥコマンドは操作履歴を順方向に進めます。新しい編集を行うと、通常はリドゥリストがクリアされます。分岐リドゥモデルを使用している場合は、新しい編集によって操作履歴が分岐します。
元に戻せる操作の回数は、プログラム、バージョン、ハードウェアまたはソフトウェアの機能によって異なります。たとえば、Adobe Photoshopのデフォルトの元に戻す/やり直しスタックサイズは 20 ですが、ユーザーが変更できます。別の例として、以前のバージョンのMicrosoft Paintでは最大 3 回までしか元に戻せませんでしたが、 Windows 7で導入されたバージョンではこの制限が 50 に引き上げられました。
単純な単一編集のアンドゥ機能では、アンドゥコマンド自体をアンドゥ可能なアクションとして扱うことで、「やり直し」をなくすことがあります。これは、ユーザーがアンドゥコマンドを使用して2つのプログラム状態を切り替えることができるため、フリップアンドゥモデルとして知られています。[ 14 ]これは、1990年代初頭に複数レベルのアンドゥが広く採用される以前の標準モデルでした。
アンドゥ機能は、さまざまなパターンで実装できます。最も一般的なパターンは、コマンドパターンとメメントパターンです。
コマンドパターンは、操作からの情報をコマンドオブジェクトにカプセル化するソフトウェア設計パターンです。つまり、すべてのアクションはオブジェクトに格納されます。抽象コマンドクラスは抽象実行操作を実装するため、すべてのコマンドオブジェクトには実行操作があります。元に戻すには、実行されたコマンドの効果を取り消す未実行操作も必要で、これらは履歴リストに格納されます。実行または未実行コマンドが呼び出されたときにリストが順方向と逆方向に実行されるように、元に戻すとやり直しが実装されています。[ 15 ]
シングルアンドゥでは、実行されたコマンドのみが保存されます。これに対し、マルチレベルアンドゥでは、コマンドを含む履歴リストが保存されるだけでなく、リストの最大長に応じてアンドゥレベルの数も決定できます。[ 15 ]
メメントパターンでは、オブジェクトの内部状態が保存されます。状態が保存されるオブジェクトはメメントと呼ばれ、メメントオリジネーターによって管理されます。アンドゥが実行されると、現在の状態情報で初期化されたメメントが返され、状態を確認できるようになります。メメントはオリジネーターのみが参照できます。
メメントパターンでは、アンドゥメカニズムはケアテイカーと呼ばれます。ケアテイカーはメメントの保管を担当しますが、その内容を変更することはありません。アンドゥを行うには、ケアテイカーはオリジネーターのメメントを要求し、その後アンドゥを適用します。[ 15 ]
アンドゥ機構の大部分は、特定のアプリケーションやコマンドクラスに依存することなく実装できます。これには、「履歴リストの管理、履歴スクロール、アンドゥとリドゥのメニュー項目、および次に使用可能なコマンドの名前に応じたメニュー項目の更新」が含まれます。[ 2 ]
すべてのコマンドクラスには、コマンド実行時に呼び出される do メソッドがあります。undo メソッドは、do メソッドの逆の操作を実装します。逆の操作を実装するには、いくつかの異なる方法があります。
FRESSの初心者ユーザーにとって最も人気のある機能は、複数のディスプレイとユーザーに対応できる機能ではなく、「元に戻す」機能でした。これは、van Damが最も誇りに思っている機能です(van Dam 2011)。FRESSは、ワープロとハイパーテキストの両方で単一レベルの元に戻す機能を先駆けて導入しました。ファイルへのすべての編集は、データ構造のシャドウバージョンに保存され、「自動保存」と元に戻すの両方が可能になりました。ブラウン大学のスタッフと学生は、この機能の重要性と有用性をすぐに理解しました(van Dam 1999)。