diff --git a/Introduction.html b/Introduction.html
index 8b54a7c..68209dc 100644
--- a/Introduction.html
+++ b/Introduction.html
@@ -27,7 +27,7 @@
実験では,2つのオープンソースプログラムから2つずつ機能を選んで,計4つの課題に取り組んでいただきます.
比較の公平性を保つため,4つのうちの2つの課題に対しては順方向バージョンを,残り2つの課題に対しては逆方向バージョンを用いてソースコードを追いかけていただき,
それぞれの操作に要した時間を計測した上で,課題ごとにアンケートにお答えいただきます.
- 全体の作業時間としては,5~6時間程度を想定しています.
+ 全体の作業時間としては,5~7時間程度を想定しています.
お答えいただくアンケートは最初と最後,課題ごとに2個ずつの計10個あります.
アンケートへの回答が終わるたびに作業を中断していただいて構いません.
作業はすべてEC2インスタンスおよびWeb上で完結します.
@@ -76,7 +76,7 @@
実験時間(拘束時間)に関して説明いたします.
-全体の作業としては5~6時間を想定していますが,人によっては多少前後する可能性があります.
+全体の作業としては5~7時間を想定していますが,人によっては多少前後する可能性があります.
時間に余裕がある際に行ってください.
また,後日大学にお越しいただいたり,こちらから連絡を行うことはありません(参加者に不利益が発生する恐れのある場合は除く).
現在は, 呼び出し元である FigNodeModelElement クラスの removeFromDiagramImpl() メソッドを見ています.
- ここで, 変数ビューを見ると, このメソッドも先ほどと同様に FigClass クラスのインスタンス (id = 1675174935) によって呼び出されていることがわかります.
+ ここで, 変数ビューを見ると, このメソッドも先ほどと同様に FigClass クラスのインスタンス (id = 1675174935) に対して呼び出されていることがわかります.
これを確認したら, 呼び出しスタック上でさらに1つ呼び出し元をクリックしてください.


Editor クラスの getSelectionManager() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, Editor クラスのインスタンス (id = 371019845) が
- フィールド _selectionManager として SelectionManager クラスのインスタンス (id = 4310438) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, Editor クラスのインスタンス (id = 371019845) の
+ フィールド _selectionManager が SelectionManager クラスのインスタンス (id = 4310438) を参照していることがわかります.
これを確認したら, ステップリターンを1回押して呼び出し元に戻ってください.

ここで, まずはステップインを3回押してください.
すると, selections に対する get() メソッドの実行が終了し, その戻り値に対して getContent() メソッドを呼び出す直前の時点にまで現在の実行時点が進みます.
+ (変数ビューを見ると, Selection.getContent() の呼び出し前であることがわかります.)
ここで, ステップインを1回押して, SelectionClass クラスの getContent() メソッドの中に入ってください.

Selection クラスの getContent() メソッドの中に入りました.
- ここで, 変数ビュー上の this を開くと SelectionClass クラスのインスタンス (id = 1672744985) が
- フィールド content として FigClass クラスのインスタンス (id = 1675174935) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと SelectionClass クラスのインスタンス (id = 1672744985) の
+ フィールド content が FigClass クラスのインスタンス (id = 1675174935) を参照していることがわかります.
これを確認したら, ステップリターンを1回押して呼び出し元に戻ってください.

SelectionManager クラスの getFigs() メソッドに戻ってきました.
- ここで, 変数ビュー上の「呼び出し前」を開いて引数のIDを確認してください.
- すると, 先ほど取得してきた FigClass クラスのインスタンス (id = 1675174935) をローカル変数 figs に追加することがわかります.
+ ここで, 変数ビュー上の「呼び出し前」 (Vector.addElement(Object) の呼び出し前) を開いて引数のIDを確認してください.
+ すると, 先ほど取得してきた FigClass クラスのインスタンス (id = 1675174935) がローカル変数 figs に追加されることがわかります.

@@ -199,7 +201,7 @@
呼び出し元である ActionRemoveFromDiagram クラスの actionPerformed(ActionEvent) メソッドに戻ってきました.
ここで, ステップオーバーを1回押して, 87行目に進んでください.
- そのあと, 変数ビュー上の「呼び出し後」を開いて戻り値のIDを確認してください.
+ そのあと, 変数ビュー上の「呼び出し後」 (Iterator.next() の呼び出し後) を開いて戻り値のIDを確認してください.
すると, 先ほどの FigClass クラスのインスタンス (id = 1675174935) を取得していることがわかります.
これを確認したら, ステップオーバーを2回押して89行目に進んでください.

Globals クラスの static メソッドである curEditor() メソッドに入りました.
- ここで, ソースコードを見ると, Globals クラスが static フィールド _curEditor として Editor クラスのインスタンスを参照していることがわかります.
+ ここで, ソースコードを見ると, Globals クラスの static フィールド _curEditor が Editor クラスのインスタンスを参照していることがわかります.
これを確認したら, 呼び出しスタック上で1つ呼び出し元をクリックしてください.

課題A1 (機能理解) の終了直後は下図のような状態でデバッグ実行が終了しているはずです.
デバッグ実行が終了していることを確認したら, 右上にあるパースペクティブを右クリックし, いったん「トレースデバッガ(順方向)」のパースペクティブを閉じてください.
+ ここでは, 課題A1 (機能理解) では使用しなかった逆方向バージョンのある機能を用いて, 課題A1 (機能理解) と同等の内容を理解していくことを目指します.

@@ -64,8 +65,9 @@
ここまでで, ActionRemoveFromDiagram クラスのインスタンスに FigClass クラスのインスタンス (id = 1675174935) が接近する過程を見てきました.
- 抽出した結果を見ると, SelectionManager クラスのインスタンス (id = 4310438) のローカル変数 figs が参照している Vector に追加されていた FigClass クラスのインスタンスを
- 取得してきていることがわかりましたが, その FigClass クラスのインスタンスがどうやって追加されたのかについては, この抽出範囲だけではわかりません.
+ 抽出した結果 (「参照先側012」と「参照先側013」) を見ると, SelectionManager#getFigs() 中のローカル変数 figs が参照している
+ Vector オブジェクトに追加された FigClass クラスのインスタンスを後で取得してきていることがわかりましたが,
+ その FigClass クラスのインスタンスが Vector オブジェクトに追加されるまでの経緯は, この抽出範囲だけではわかりません.
そこで, ここからは, そのローカル変数 figs に FigClass クラスのインスタンス (id = 1675174935) が追加されるまでの過程を見ていきます.
まずは, 「オブジェクトの接近過程抽出」ビュー上の「参照先側012」をクリックしてください.

ここで, 変数ビュー上の「呼び出し前」のメソッド名が Vector.addElement(Object) であることを確認してください.
それを確認したら, 変数ビュー上の「呼び出し前」を開いて, 引数を右クリックしてください.
- 右クリックすると, ポップアップメニューが出てくるので, 上の方の「オブジェクトの接近過程抽出」をクリックしてください.
+ 右クリックすると, ポップアップメニューが出てくるので, 上の方の Vector クラスのインスタンスと FigClass クラスのインスタンスに対する
+ 「オブジェクトの接近過程抽出」をクリックしてください.

@@ -106,8 +109,8 @@

- ここまでで, SelectionManager クラスのインスタンス (id = 4310438) のローカル変数 figs が参照している Vector に
- FigClass クラスのインスタンス (id = 1675174935) が追加されるまでの過程を見てきました.
+ ここまでで, SelectionManager#getFigs() メソッド内のローカル変数 figs が参照している Vector クラスのインスタンス
+ (id = 450474599) に FigClass クラスのインスタンス (id = 1675174935) が追加されるまでの過程を見てきました.
ここで, 課題A1の接近過程抽出は終了です.
「オブジェクトの接近過程」ビューを全て閉じ, そのあとデバッグ実行を終了してください.
デバッグ実行を終了したら, この「トレースデバッガ(逆方向)」のパースペクティブを閉じてください.
diff --git a/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_04.png b/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_04.png
index c6e09c4..c588eb3 100644
--- a/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_04.png
+++ b/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_04.png
Binary files differ
diff --git a/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_09.png b/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_09.png
index 153aeb6..bf4e181 100644
--- a/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_09.png
+++ b/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_09.png
Binary files differ
diff --git a/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_23.png b/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_23.png
index 82d7459..ca20008 100644
--- a/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_23.png
+++ b/courseA/ArgoUML_Forward/problem1/images/images_problem1/ArgoUML_1_23.png
Binary files differ
diff --git a/courseA/ArgoUML_Forward/problem1/images/images_problem1_pre/ArgoUML_1_pre_09.png b/courseA/ArgoUML_Forward/problem1/images/images_problem1_pre/ArgoUML_1_pre_09.png
index 72fb287..c45b0e2 100644
--- a/courseA/ArgoUML_Forward/problem1/images/images_problem1_pre/ArgoUML_1_pre_09.png
+++ b/courseA/ArgoUML_Forward/problem1/images/images_problem1_pre/ArgoUML_1_pre_09.png
Binary files differ
diff --git a/courseA/ArgoUML_Forward/problem2/ArgoUML2_Forward.html b/courseA/ArgoUML_Forward/problem2/ArgoUML2_Forward.html
index 8f04b97..868ecfb 100644
--- a/courseA/ArgoUML_Forward/problem2/ArgoUML2_Forward.html
+++ b/courseA/ArgoUML_Forward/problem2/ArgoUML2_Forward.html
@@ -1,5 +1,5 @@
-
+
「配置された図形がArgoUMLのシステム内部でどのように管理され,選択機能の実行によってどのように取り出されて,どのように選択図形として登録されるか?」- ArgoUMLはオープンソースのUMLモデリングツールで, Javaで書かれております.

- ここでは, フィールド selections に SelectionClass クラスのインスタンス (id = 1672744985) を実際に追加しているのはどこなのかを見ていきます.
- ソースコード中の selections にカーソルを入れ, そのフィールドに対してオブジェクトを追加している全ての行にブレークポイントを入れてください.
- 今回は, SelectionManager クラスの125行目と130行目の二か所が該当します.
+ まず, 課題A1で開いた SelectionManager クラスを見ていきます.
+ (閉じてしまった場合は, GEF プロジェクト内で, SelectionManager の型の宣言を検索してください.)
+ ここでは, SelectionManager のフィールド selections に SelectionClass クラスのインスタンス (id = 1672744985) を
+ 実際に追加しているのはどこなのかを見ていきます.
+ ソースコード中の selections のいずれかの参照箇所にカーソルを入れ, その selections に対してオブジェクトを追加している
+ 全ての行にブレークポイントを入れてください. 今回は, SelectionManager クラスの125行目と130行目の二か所が該当します.

- SelectinoManager クラスの125行目と130行目にブレークポイントを入れた状態で,
+ SelectionManager クラスの125行目と130行目にブレークポイントを入れた状態で,
ブレークポイントビュー上の「ブレークポイントをEclipseから取り入れる」アイコンを押してください.
- すると, 実際にトレース上に実行された記録が残っている130行目にだけブレークポイントが新規追加されます.
+ すると, 実際にトレース上に実行された記録が残っている130行目のブレークポイントだけが新規追加されます.
そのあと, ブレークポイントビュー上で下記のブレークポイントのチェックを外してください.

Fig クラスはグラフィックエディタ上の図形を表すGEFの内部のクラスです.
また, FigClass クラスはクラス図上に配置された「クラス」を表す ArgoUML のクラスで, Fig クラスの子孫クラスにあたります.
- ブレークポイントを置いた行は、図形を選択するたびに実行されます.
+ ブレークポイントを置いた行は, 図形を選択するたびに実行されます. この行が2回実行される理由は, クラス配置機能で配置されたクラスが選択状態になるときに,
+ まず1回目の実行が行われるためです.
@@ -67,10 +71,10 @@
この状態になっていれば, ここから時間計測を開始してください. 時間計測はできる限り,1分以内の単位での計測をお願いします.
- ここで, ソースコードと変数ビューを見ると, SelectionManager クラスのインスタンス (id = 4310438) が参照するフィールド selections へは
- makeSelectionFor(Fig) メソッドの戻り値 (SelectionClass クラスのインスタンス) が追加されていることがわかります.
+ ここで, ソースコードと変数ビューを見ると, SelectionManager クラスのインスタンス (id = 4310438) のフィールド selections が参照している
+ ArrayList クラスのインスタンスに, makeSelectionFor(Fig) メソッドの戻り値 (SelectionClass クラスのインスタンス) が追加されていることがわかります.
課題A2では, このオブジェクトの追加に関わっている SelectionManager クラスのインスタンスと SelectionClass クラスのインスタンスについて見ていきます.
- まずは, ステップインを3回押して, この makeSelectionFor(Fig) メソッドの中に入ってください.
+ まずは, SelectionClass クラスのインスタンスについて見ていきます. ステップインを3回押して, この makeSelectionFor(Fig) メソッドの中に入ってください.

@@ -98,10 +102,10 @@
SelectionManager クラスの addFig(Fig) メソッドに戻ってきました.
- ここで, 変数ビュー上の「呼び出し前」を開くと, 先ほどの SelectionClass クラスのインスタンス (id = 1672744985) が引数として渡されており,
- これがフィールド selections に追加されることがわかります.
+ ここで, 変数ビュー上の「呼び出し前」を開くと, 先ほどの SelectionClass クラスのインスタンス (id = 1672744985) が
+ List.add(Object) メソッドの数として渡されており, これがフィールド selections に追加されることがわかります.
また, この引数をさらに開くと, SelectionClass クラスのインスタンス (id = 1672744985) が
- フィールド content として 実際に FigClass クラスのインスタンス(id = 1675174935) を参照していることを確認できます.
+ フィールド content として実際に FigClass クラスのインスタンス(id = 1675174935) を参照していることを確認できます.
ここからは, FigClass クラスのインスタンス(id = 1675174935) について見ていきます.
ソースコードと変数ビューを見ると, このインスタンスは 仮引数 f として渡されていることが確認できます.
この仮引数 f の値がどこから来たのかを見るために, 呼び出しスタック上で1つ呼び出し元をクリックしてください.
@@ -110,7 +114,7 @@
現在は SelectionManager クラスの select(Fig) メソッドの180行目を見ています.
ここで, ソースコードを見ると, この FigClass クラスのインスタンス (id = 1675174935) は, ここでも仮引数として渡されてきていることが確認できます.
- これを確認したら, 呼び出しスタック上で1つ呼び出し元をクリックしてください.
+ これを確認したら, 呼び出しスタック上でさらに1つ呼び出し元をクリックしてください.

@@ -132,11 +136,11 @@
ここで, 再開ボタンを1回押すと, 次は ModeSelect クラスの mousePressed(MouseEvent) メソッドの160行目で止まります.
そのあと, 再開ボタンをもう1回押すと, 再び160行目で止まることが確認できます.
さらに再開ボタンを押すと, SelectionManager クラスの addFig(Fig) メソッドの130行目に止まることが確認できます.
- これによって, 2回目の160行目の時点がローカル変数 underMouse に値が代入された直前の実行時点だとわかります.
+ これによって, 160行目の2回目の実行がローカル変数 underMouse に値が代入された直前の実行時点だとわかります.
これを確認したら, いったんデバッグ実行を終了してから, 再びデバッグ実行してください.
- そのあと, 再開ボタンを2回押して, 2回目の160行目にまで進んでください.
+ そのあと, 再開ボタンを2回押して, 160行目の2回目の実行にまで進んでください.
ここで, ステップオーバーを1回押すと, 163行目に止まることが確認できます.
163行目では, ローカル変数 underMouse で参照されているインスタンスに対して deepSelect(Rectangle) メソッドが呼び出され
その戻り値がローカル変数 underMouse に再び代入されていることが確認できます.
@@ -150,7 +154,7 @@
いったんデバッグ実行を終了してから, 再びデバッグ実行してください.
- まずは, 再開ボタンを2回押して, 2回目の160行目にまで進んでください.
+ まずは, 再開ボタンを2回押して, 160行目の2回目の実行にまで進んでください.
そのあと, ステップオーバーを1回押して163行目に進んでください.
ここで, ステップインを2回押して FigGroup クラスの deepSelect(Rectangle) メソッドの中に入ってください.

いったんデバッグ実行を終了してから, 再びデバッグ実行してください.
- そのあと, 再開ボタンを2回押して, 2回目の160行目にまで進んでください.
+ そのあと, 再開ボタンを2回押して, 再度160行目の2回目の実行にまで進んでください.
ソースコードを見ると, 160行目では Editor クラスの hit(Point) メソッドが呼び出され,
その戻り値がローカル変数 underMouse に代入されていることが確認できます.
ここで, ステップインを3回押して, このメソッドの中に入ってください.
@@ -189,27 +193,27 @@
Editor クラスの getLayerManager() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, Editor クラスのインスタンス (id = 371019845) が
- フィールド _layerManager として LayerManager クラスのインスタンス (id = 1975264229) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, Editor クラスのインスタンス (id = 371019845) の
+ フィールド _layerManager が LayerManager クラスのインスタンス (id = 1975264229) を参照していることがわかります.
これを確認したら, ステップオーバーを1回押して呼び出し元に戻ってください.

Editor クラスの hit(Rectangle) メソッドに戻ってきました.
- ここでは, ステップインを1回押して, LayerManager クラスの hit(Rectangle) メソッドの中に入ってください.
+ 次に, ステップインを1回押して, LayerManager クラスの hit(Rectangle) メソッドの中に入ってください.

LayerManager クラスの hit(Rectangle) メソッドに入りました.
- ここで, 変数ビュー上の this を開くと LayerManager クラスのインスタンス (id = 1975264229) が
- フィールド _activeLayer として LayerPerspectiveMutable クラスのインスタンス (id = 1248750852) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと LayerManager クラスのインスタンス (id = 1975264229) の
+ フィールド _activeLayer が LayerPerspectiveMutable クラスのインスタンス (id = 1248750852) を参照していることがわかります.
これを確認したら, ステップインを4回押して LayerPerspectiveMutable クラスの hit(Rectangle) メソッドの中に入ってください.

LayerPerspectiveMutable クラスの hit(Rectangle) メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, LayerPerspectiveMutable クラスのインスタンス (id = 1248750852) が
- フィールド contents として ArrayList を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, LayerPerspectiveMutable クラスのインスタンス (id = 1248750852) の
+ フィールド contents が ArrayList を参照していることがわかります.
また, ソースコードを見ると, 231行目でこの ArrayList から取り出してきた要素を, 233行目の return f で戻り値として返されていることが確認できます.
ここでは, ステップオーバーを2回押して232行目にまで進んでください.

現在は ModeSelect クラスの mousePressed(MouseEvent) メソッドの160行目を見ています.
- ここで, 変数ビュー上の this を開くと, ModeSelect クラスのインスタンス (id = 1807431709) が
- フィールド editor として Editor クラスのインスタンス (id = 371019845) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, ModeSelect クラスのインスタンス (id = 1807431709) の
+ フィールド editor が Editor クラスのインスタンス (id = 371019845) を参照していることがわかります.

ここまでの結果から, SelectionClass クラスのインスタンスに関わる各オブジェクトの関係について, 以下のことがわかりました.
@@ -255,19 +259,19 @@
ここで, 再開ボタンを1回押すと, 次は ModeSelect クラスの mousePressed(MouseEvent) メソッドの156行目で止まります.
そのあと, 再開ボタンをもう1回押すと, 再び156行目で止まることが確認できます.
さらに再開ボタンを押すと, SelectionManager クラスの addFig(Fig) メソッドの130行目に止まることが確認できます.
- これによって, 2回目の156行目の時点がローカル変数 sm に値が代入された直前の実行時点だとわかります.
+ これによって, 156行目の2回目の実行がローカル変数 sm に値が代入された直前の実行時点だとわかります.
これを確認したら, いったんデバッグ実行を終了してから, 再びデバッグ実行してください.
- そのあと, 再開ボタンを2回押して, 2回目の156行目にまで進んでください.
+ そのあと, 再開ボタンを2回押して, 156行目の2回目の実行にまで進んでください.
156行目では, Editor クラスの getSelectionManager() メソッドが呼び出され, その戻り値がローカル変数 sm に代入されていることが確認できます.
ここで, ステップインを2回押して, このメソッドの中に入ってください.

Editor クラスの getSelectionManager() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと Editor クラスのインスタンス (id = 371019845) が
- フィールド _selectionManager として SelectionManager クラスのインスタンス (id = 4310438) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと Editor クラスのインスタンス (id = 371019845) の
+ フィールド _selectionManager が SelectionManager クラスのインスタンス (id = 4310438) を参照していることがわかります.
これを確認したら, 呼び出しスタック上で1つ呼び出し元をクリックしてください.

課題A2 (機能理解) の終了直後は下図のような状態でデバッグ実行が終了しているはずです.
デバッグ実行が終了していることを確認したら, 右上にあるパースペクティブを右クリックし, いったん「トレースデバッガ(順方向)」のパースペクティブを閉じてください.
+ ここでは, 課題A2 (機能理解) では使用しなかった逆方向バージョンのある機能を用いて, 課題A2 (機能理解) と同等の内容を理解していくことを目指します.

@@ -27,22 +28,24 @@
その状態のままで, ブレークポイントビュー上にある「ブレークポイントを取り入れる」をクリックしてください.
- ブレークポイントを取り入れたら, デバッグ実行してください.
- まずは, SelectionManager クラスのインスタンス (id = 4310438) のフィールド selections が参照している ArrayList に
+ SelectionManager.addFig(Fig) メソッドの130行目と, ModeSelect.mousePressed(MouseEvent) メソッドの156行目の
+ 2つにチェックが入っているはずです. ブレークポイントを確認したら, デバッグ実行してください.
+ まずは, SelectionManager クラスのインスタンス (id = 4310438) のフィールド selections が参照している ArrayList のインスタンスに
SelectionClass クラスのインスタンス (id = 1672744985) が追加されるまでの過程を見ていきます.
デバッグ実行したら, そのまま再開ボタンを3回押してください.
- すると, 現在の実行時点が2回目の SelectionManager クラスの addFig(Fig) メソッドの130行目に移ります.
+ すると, SelectionManager クラスの addFig(Fig) メソッドの130行目の2回目の実行で一時停止します.

- 現在は, 2回目の SelectionManager クラスの addFig(Fig) メソッドの130行目にいます.
+ 現在は, SelectionManager クラスの addFig(Fig) メソッドの130行目にいます.
ここで, ステップネクストを3回押してください.

ここで, 変数ビュー上の「呼び出し前」のメソッド名が List.add(Object) であることを確認してください.
それを確認したら, 変数ビュー上の「呼び出し前」を開いて, 引数を右クリックしてください.
- 右クリックすると, ポップアップメニューが出てくるので, 上の方の「オブジェクトの接近過程抽出」をクリックしてください.
+ 右クリックすると, ポップアップメニューが出てくるので, 上の方の ArrayList クラスのインスタンスと
+ SelectionClass のインスタンスを対象とした「オブジェクトの接近過程抽出」をクリックしてください.

diff --git a/courseA/CourseDescriptionA.html b/courseA/CourseDescriptionA.html
index bee8a07..8ecdbd4 100644
--- a/courseA/CourseDescriptionA.html
+++ b/courseA/CourseDescriptionA.html
@@ -17,7 +17,7 @@
この度は私共の実験にご協力頂きまして誠にありがとうございます.
- これから行っていただく作業は,4つの課題とアンケートへの回答です.全体の作業時間としては,5~6時間程度を想定しています.
+ これから行っていただく作業は,4つの課題とアンケートへの回答です.全体の作業時間としては,5~7時間程度を想定しています.
実験に入る前にAmazon EC2インスタンスにログインしていただき,実験で使用するトレースデバッガの操作の練習を行っていただきます.
実験では,2つのオープンソースプログラムの4つの機能を対象に4つの課題に取り組んでいただきます.
これ以降お答えいただくアンケートは実験中に8個と,最後に1つの計9個あります.
@@ -28,7 +28,7 @@
いよいよ実験に入っていきます.
トレースデバッガの操作に要した時間を測っていただきますので,お手元に時計をご用意ください.
- 時間計測にあたって,急いで操作していただく必要はまったくありません.最初の課題から最後の課題まで同じペースで操作することを意識してください.
+ 時間計測にあたって,急いで操作していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースで, 課題の内容を理解しながら操作することを意識してください.
まず,ArgoUMLの説明をお読みいただき,ArgoUMLに関する課題A1と課題A2に取り組んでいただきます.
その後,JHotDrawの説明をお読みいただき,JHotDrawに関する課題A3と課題A4に取り組んでいただきます.
課題A1, A2では順方向バージョン,課題A3, A4では逆方向バージョンのトレースデバッガをお使いいただきます.
diff --git a/courseA/JHotDraw_Reverse/problem1/JHotDraw1_Reverse.html b/courseA/JHotDraw_Reverse/problem1/JHotDraw1_Reverse.html
index 01b5105..9150c59 100644
--- a/courseA/JHotDraw_Reverse/problem1/JHotDraw1_Reverse.html
+++ b/courseA/JHotDraw_Reverse/problem1/JHotDraw1_Reverse.html
@@ -13,7 +13,7 @@
「選択された図形がJHotDrawのシステム内部でどのように管理され,図形移動機能の実行によってどのように取り出されて,移動していくか?」- JHotDrawはオープンソースの図形描画ツールで, Javaで書かれております.
+ Figure クラスは図形を表す JHotDraw のクラスです.
+ また, RectangleFigure クラスは矩形を表す JHotDraw のクラスで, Figure クラスの子孫クラスにあたります.
ブレークポイントを置いた行は、図形を移動するたびに実行されます.
先ほどのステップバックオーバーの実行によって157行目まで戻ってきました.
ここでは, まずステップネクストを1回押してください.
- そのあと, 変数ビュー上にある「呼び出し後」を開くと,
+ そのあと, 変数ビュー上にある「呼び出し後」 (Iterator.next() の呼び出し後) を開くと,
戻り値として RectangleFigure クラスのインスタンス (id = 1952912699) が返されていることがわかります.

- ソースコードを見ると, RectangleFigure クラスのインスタンス (id = 1952912699) は DefaultDragTracker クラスのインスタンス (id = 758826749) が
- フィールド transFormedFigures の要素として参照していることがわかります.
+ ソースコードを見ると, RectangleFigure クラスのインスタンス (id = 1952912699) は DefaultDragTracker クラスのインスタンス (id = 758826749) の
+ フィールド transFormedFigures が参照しているセットから取得していることがわかります.
次は, この transFormedFigures に RectangleFigure クラスのインスタンスがどの実行時点で追加されたのかを見ていきます.
ここで, 変数ビュー上の「呼び出し後」のメソッド名が Iterator.next() であることを確認してください.
それを確認したら, 変数ビュー上で開いている「呼び出し後」の中にある戻り値を右クリックして「オブジェクトの追加時点に飛ぶ」を選択してください.
@@ -97,7 +99,7 @@
先ほどの操作によって, DefaultDragTracker クラスの mousePressed(MouseEvent) メソッドの118行目に現在の実行時点が移りました.
- この118行目では, ローカル変数 f の値が フィールド transFormedFigures に追加されていることが確認できます.
+ この118行目では, ローカル変数 f の値が フィールド transFormedFigures が参照している HashSet のインスタンスに追加されていることが確認できます.
ここで, 「トレースデバッガ」パースペクティブの右下にある「実行時点の登録」ビューの追加ボタンをクリックしてください.
そうすると, 現在の実行時点がこのビュー上に登録されます.


先ほどの結果から, RectangleFigure クラスのインスタンス (id = 1952912699) は
- DefaultDrawingView クラスのインスタンス (id = 150367587) が セットの要素として参照していることがわかりました.
+ DefaultDrawingView クラスのインスタンス (id = 150367587) が LinkedHashSet の要素として保持していることがわかりました.
次は, この DefaultDrawingView クラスのインスタンスがどこから来たのかを見ていきます.
ここでは, ステップバックオーバーを5回押して98行目に戻ってください.
ソースコードを見ると, getView() メソッドの戻り値を ローカル変数 view に代入していることが確認できます.
@@ -129,15 +132,15 @@
AbstractTool クラスの getView() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDragTracker クラスのインスタンス (id = 758826749) が
+ ここで, 変数ビュー上の this を開くと, DefaultDragTracker クラスのインスタンス (id = 758826749) の editor フィールドが
DefaultDrawingEditor クラスのインスタンス (id = 1859859960) を参照していることがわかります.
- これを確認したら, ステップインを3回押して DefaultDrawingEditor クラスの getAcitiveView() メソッドの中に前から入ってください.
+ これを確認したら, ステップインを3回押して DefaultDrawingEditor クラスの getActiveView() メソッドの中に前から入ってください.

DefaultDrawingEditor クラスの getAcitiveView() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) が
- フィールド activeView として DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) の
+ フィールド activeView が DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.

diff --git a/courseA/JHotDraw_Reverse/problem1/JHotDraw1_Reverse_Delta.html b/courseA/JHotDraw_Reverse/problem1/JHotDraw1_Reverse_Delta.html index 5a93ff6..f94d205 100644 --- a/courseA/JHotDraw_Reverse/problem1/JHotDraw1_Reverse_Delta.html +++ b/courseA/JHotDraw_Reverse/problem1/JHotDraw1_Reverse_Delta.html @@ -17,7 +17,8 @@
課題A3 (機能理解) の終了直後は下図のような状態になっているはずです.
- まずは, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド transformedFigures が参照している HashSet に
+ ここでは, 課題A3 (機能理解) では使用しなかった逆方向バージョンのある機能を用いて, 課題A3 (機能理解) と同等の内容を理解していくことを目指します.
+ まずは, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド transformedFigures が参照している HashSet のインスタンスに
RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を抽出して見ていきます.
ここで, 「実行時点の登録」ビュー上で登録している「118行目 DefaultDragTracker.mousePressed(MouseEvent)」をダブルクリックしてください.
すると, 現在の実行時点が DefaultDragTracker クラスの mousePressed(MouseEvent) メソッドの118行目に移ります.
@@ -28,7 +29,8 @@
先ほどの操作によって, 現在は DefaultDragTracker クラスの mousePressed(MouseEvent) メソッドの118行目にいます.
ここで, 変数ビュー上の「呼び出し前」のメソッド名が HashSet.add(Object) であることを確認してください.
それを確認したら, 変数ビュー上の「呼び出し前」を開いて, 引数を右クリックしてください.
- 右クリックすると, ポップアップメニューが出てくるので, 上の方の「オブジェクトの接近過程抽出」をクリックしてください.
+ 右クリックすると, ポップアップメニューが出てくるので, 上の方の HashSet のインスタンスと RectangleFigure のインスタンスを
+ 対象とした「オブジェクトの接近過程抽出」をクリックしてください.

@@ -54,8 +56,8 @@

- ここまでで, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド transformedFigures が参照している HashSet に
- RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を見てきました.
+ ここまでで, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド transformedFigures が参照している
+ HashSet のインスタンスに, RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を見てきました.
ここで, 課題A3の接近過程抽出は終了です.
「オブジェクトの接近過程」ビューを全て閉じてください.
なお, デバッグ実行は終了せずにそのままの状態にしておいてください.
diff --git a/courseA/JHotDraw_Reverse/problem2/JHotDraw2_Reverse.html b/courseA/JHotDraw_Reverse/problem2/JHotDraw2_Reverse.html
index b3e14f5..8538baf 100644
--- a/courseA/JHotDraw_Reverse/problem2/JHotDraw2_Reverse.html
+++ b/courseA/JHotDraw_Reverse/problem2/JHotDraw2_Reverse.html
@@ -13,7 +13,7 @@
「配置された図形がJHotDrawのシステム内部でどのように管理され,図形選択機能の実行によってどのように取り出されて,どのように選択図形として登録されるか?」- JHotDrawはオープンソースの図形描画ツールで, Javaで書かれております.
- 現在の実行時点の行は、図形を選択するたびに実行されます.
+ Figure クラスは図形を表す JHotDraw のクラスです.
+ また, RectangleFigure クラスは矩形を表す JHotDraw のクラスで, Figure クラスの子孫クラスにあたります.
+ 現在の実行時点の行は、図形を選択するたびに実行されます.
@@ -54,7 +56,7 @@
まずは,「実行時点の登録」ビューの追加ボタンをクリックして実行時点の登録を行ってください.
- ここで, ソースコードと変数ビューを見ると, DefaultDrawingView クラスのインスタンス (id = 150367587) が参照するフィールド selectedFigures へは
+ ここで, ソースコードと変数ビューを見ると, DefaultDrawingView クラスのインスタンス (id = 150367587) のフィールド selectedFigures が参照しているセットへは
RectangleFigure クラスのインスタンス (id = 1952912699) が追加されていることがわかります.
課題A4では, このオブジェクトの追加に関わっている DefaultDrawingView クラスのインスタンスと RectangleFigure クラスのインスタンスについて見ていきます.


@@ -75,15 +77,15 @@
AbstractTool クラスの getView() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDragTracker クラスのインスタンス (id = 758826749) が
- DefaultDraingEditor クラスのインスタンス (id = 1859859960) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DefaultDragTracker クラスのインスタンス (id = 758826749) の editor フィールドが
+ DefaultDrawingEditor クラスのインスタンス (id = 1859859960) を参照していることがわかります.
これを確認したら, ステップインを3回押して DefaultDrawingEditor クラスの getAcitiveView() メソッドの中に前から入ってください.

- DefaultDrawingEditor クラスの getAcitiveView() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) が
- フィールド activeView として DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.
+ DefaultDrawingEditor クラスの getActiveView() メソッドに入りました.
+ ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) の
+ フィールド activeView が DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.

@@ -97,12 +99,12 @@
今までの結果から, DefaultDrawingView クラスのインスタンス (id = 150367587) がどのようにして来たのかがわかりました.
ここからは, RectangleFigure クラスのインスタンス (id = 1952912699) がどこから来たのかを見ていきます.
ここで, 変数ビュー上の this を開き, その中にある anchorFigure を右クリックしてください.
- 右クリックするとポップアップメニューが現れるので, 「値の代時点に飛ぶ」を選択してください.
+ 右クリックするとポップアップメニューが現れるので, 「値の代入時点に飛ぶ」を選択してください.

- 「値の追加時点に飛ぶ」を選択すると, DefaulatDragTracker クラスのインスタンス (id = 758826749) に
- この RectangleFigure クラスのインスタンス (id = 1952912699) が追加された時点である
+ 「値の代入時点に飛ぶ」を選択すると, DefaultDragTracker クラスのインスタンス (id = 758826749) の anchorFigure フィールドに
+ この RectangleFigure クラスのインスタンス (id = 1952912699) への参照が代入された時点である
DefaultDragTracker クラスの setDraggedFigure(Figure) メソッドの218行目にまで現在の実行時点が遡ります.
まずは, 「実行時点の登録」ビューの追加ボタンをクリックして実行時点の登録を行ってください.
ここでは, DefaultDragTracker クラスのフィールド anchorFigure に仮引数 f の値を代入していることが確認できます.
@@ -112,7 +114,8 @@
現在は, 呼び出し元である SelectionTool クラスの getDragTracker() メソッド見ています.
ここで 変数ビュー上の 「呼び出し前」および this を開くと, 先ほどの setDraggedFigure (Figure) メソッドが呼び出されている
- DefaultDragTracker クラスのインスタンス (id = 758826749) は DelegationSelectionTool クラスのインスタンス (id = 5999587451) が参照していることがわかります.
+ DefaultDragTracker クラスのインスタンス (id = 758826749) は, DelegationSelectionTool クラスのインスタンス (id = 5999587451) の
+ dragTracker フィールドによって参照されていることがわかります.
引き続き, 仮引数 f の値がどこから来ているのかを見るために, 呼び出しスタック上でさらに1つ呼び出し元をクリックしてください.

DefaultDrawingView クラスの getDrawing() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDrawingView クラスのインスタンス (id = 150367587) が
- フィールド drawing として QuadTreeDrawing クラスのインスタンス (id = 1583174451) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DefaultDrawingView クラスのインスタンス (id = 150367587) の
+ フィールド drawing が QuadTreeDrawing クラスのインスタンス (id = 1583174451) を参照していることがわかります.
これを確認したら, ステップリターンを1回押して呼び出し元に戻ってください.

DefaultDrawingView クラスの findFigure(Point) メソッドに戻ってきました.
- ここでは, まずステップネクストを1回押して viewToDrawingPoint(Point) メソッドを飛ばし,
+ ここでは, まずステップネクストを1回押して viewToDrawingPoint(Point) メソッドの呼び出しを飛ばし,
それから, ステップインを1回押して QuadTreeDrawing クラスの findFigure(Point2D$Double) メソッドの中に前から入ってください.


QuadTree クラスの findContains(Point2D$Double) メソッドに入りました.
- ここで, 変数ビュー上の this を開くとQuadTree クラスのインスタンス (id = 808853315) がフィールド root として
+ ここで, 変数ビュー上の this を開くとQuadTree クラスのインスタンス (id = 808853315) のフィールド root が
QuadTree の内部クラス QuadNode クラスのインスタンス (id = 2120356010) を参照していることがわかります.
ここでは, ステップオーバーを1回押して83行目に進んだあと, ステップインを2回押して,
QuadTree$QuadNode クラスの findContains(Point2D$Double, HashSet) メソッドの中に前から入ってください.
@@ -164,15 +167,15 @@
QuadTree$QuadNode クラスの findContains(Point2D$Double, HashSet) メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, QuadTree$QuadNode クラスのインスタンスは
- フィールド objects として HashMap を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, QuadTree$QuadNode クラスのインスタンスの
+ フィールド objects が HashMap のインスタンスを参照していることがわかります.

ここでは, ステップオーバーを3回押して226行目まで進んだあと, ステップネクストを2回押してください.
ソースコードを見ると, 224行目の拡張for文で 先ほど確認した HashMap から取得してきた要素を用いて,
- 226行目ではそのうちのキー要素だけを取り出して, それを仮引数 result で参照されているセットに追加していることが確認できます.
- ここで, 変数ビュー上の「呼び出し後」および「呼び出し前」を開くと,
+ 226行目ではそのうちのキー要素だけを取り出して, それを仮引数 result で参照されている HashSet オブジェクトに追加していることが確認できます.
+ ここで, 変数ビュー上の「呼び出し後」 (Entry.getKey() の呼び出し後) および「呼び出し前」 (HasSet.add(Object) の呼び出し前) を開くと,
実際に RectangleFigure クラスのインスタンス (id = 1952912699) を取得してから追加していることを確認できます.
これを確認したら, ステップオーバーを4回押して呼び出し元に戻ってください.

現在は QuadTreeDrawing クラスの findFigure(Point2D$Double) メソッドの129行目にいます.
そのあと, ステップネクストを3回実行すると, 現在の実行時点が130行目に移ります.
- ここで, 変数ビュー上の「呼び出し後」を開き, 戻り値として RectangleFigure クラスのインスタンス (id = 1952912699) があることを確認してください.
+ ここで, 変数ビュー上の「呼び出し後」 (Iterator.next() の呼び出し後) を開き, 戻り値が RectangleFigure クラスの
+ インスタンス (id = 1952912699) であることを確認してください.
これを確認したら, 呼び出しスタック上で2つ呼び出し元をクリックしてください.

AbstractTool クラスの getView() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, DelegationSelectionTool クラスのインスタンス (id = 599587451) が
- DefaultDraingEditor クラスのインスタンス (id = 1859859960) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DelegationSelectionTool クラスのインスタンス (id = 599587451) の editor フィールドが
+ DefaultDrawingEditor クラスのインスタンス (id = 1859859960) を参照していることがわかります.
これを確認したら, ステップインを3回押して DefaultDrawingEditor クラスの getAcitiveView() メソッドの中に前から入ってください.

DefaultDrawingEditor クラスの getAcitiveView() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) が
- フィールド activeView として DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) の
+ フィールド activeView が DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.

diff --git a/courseA/JHotDraw_Reverse/problem2/JHotDraw2_Reverse_Delta.html b/courseA/JHotDraw_Reverse/problem2/JHotDraw2_Reverse_Delta.html index a92bd0d..14fce26 100644 --- a/courseA/JHotDraw_Reverse/problem2/JHotDraw2_Reverse_Delta.html +++ b/courseA/JHotDraw_Reverse/problem2/JHotDraw2_Reverse_Delta.html @@ -17,7 +17,8 @@
課題A4 (機能理解) の終了直後は下図のような状態になっているはずです.
- まずは, DefaultDrawingView クラスのインスタンス (id = 150367587) のフィールド selectedFigures が参照している LinkedHashSet に
+ ここでは, 課題A4 (機能理解) では使用しなかった逆方向バージョンのある機能を用いて, 課題A4 (機能理解) と同等の内容を理解していくことを目指します.
+ まずは, DefaultDrawingView クラスのインスタンス (id = 150367587) のフィールド selectedFigures が参照している LinkedHashSet のインスタンスに
RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を見ていきます.
ここで, 「実行時点の登録」ビュー上で登録している「780行目 DefaultDrawingView.addToSelection(Figure)」をダブルクリックしてください.
すると, 現在の実行時点が DefaultDrawingView クラスの addToSelection(Figure) メソッドの780行目に移ります.
@@ -28,7 +29,8 @@
先ほどの操作によって, 現在は DefaultDrawingView クラスの addToSelection(Figure) メソッドの780行目にいます.
ここで, 変数ビュー上の「呼び出し前」のメソッド名が Set.add(Object) であることを確認してください.
それを確認したら, 変数ビュー上の「呼び出し前」を開いて, 引数を右クリックしてください.
- 右クリックすると, ポップアップメニューが出てくるので, 上の方の「オブジェクトの接近過程抽出」をクリックしてください.
+ 右クリックすると, ポップアップメニューが出てくるので, 上の方の LinkedHashSet のインスタンスと RectangleFigure の
+ インスタンスを対象とした「オブジェクトの接近過程抽出」をクリックしてください.

@@ -54,10 +56,11 @@

- ここまでで, DefaultDrawingView クラスのインスタンス (id = 150367587) のフィールド selectedFigures が参照している LinkedHashSet に
+ ここまでで, DefaultDrawingView クラスのインスタンス (id = 150367587) のフィールド selectedFigures が参照している LinkedHashSet のインスタンスに
RectangleFigure クラスのインスタンス (id = 1952912699) が接近する過程を見てきました.
- 抽出した結果を見ると, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド anchorFigure に代入されていた RectangleFigure クラスのインスタンスを
- 取得してきていることがわかりましたが, その RectangleFigure クラスのインスタンスがどうやって代入されたのかについては, この抽出範囲だけではわかりません.
+ 抽出した結果を見ると, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド anchorFigure に代入されていた
+ RectangleFigure クラスのインスタンスを取得してきていることがわかりましたが, その RectangleFigure クラスのインスタンスの参照が
+ anchorFigure フィールドに代入されるまでの経緯については, この抽出範囲だけではわかりません.
そこで, ここからは, DefaultDragTracker クラスのインスタンス (id = 758826749) に RectangleFigure クラスのインスタンス (id = 1952912699) が
接近する過程を抽出して見ていきます.
まずは, 「オブジェクトの接近過程抽出」ビュー上の「参照先側002」をクリックしてください.
@@ -101,9 +104,10 @@
ここまでで, DefaultDragTracker クラスのインスタンス (id = 758826749) に RectangleFigure クラスのインスタンス (id = 1952912699) が接近する過程を見てきました.
- 抽出した結果を見ると, QuadTree クラスのインスタンス (id = 808853315) のローカル変数 result に追加されていた RectangleFigure クラスのインスタンスを
- 取得してきていることがわかりましたが, その RectangleFigure クラスのインスタンスがどうやって追加されたのかについては, この抽出範囲だけではわかりません.
- そこで, ここからは, そのローカル変数 result に RectangleFigure クラスのインスタンス (id = 1952912699) が追加される過程を見ていきます.
+ 抽出した結果 (「参照先側022」と「参照先側023」) を見ると, QuadTree#findContents(Point2D$Double) のローカル変数 result が参照している
+ HashSet オブジェクトに追加された RectangleFigure クラスのインスタンスを取得してきていることがわかりましたが,
+ その RectangleFigure クラスのインスタンスが HashSet オブジェクトに追加されるまでの経緯は, この抽出範囲だけではわかりません.
+ そこで, ここからは, そのローカル変数 result に RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を見ていきます.
まずは, 「オブジェクトの接近過程抽出」ビュー上の「参照先側028」をクリックしてください.


@@ -152,8 +157,8 @@

- ここまでで, QuadTree クラスのインスタンス (id = 808853315) のローカル変数 result に
- RectangleFigure クラスのインスタンス (id = 1952912699) が追加される過程を見てきました.
+ ここまでで, QuadTree#findContents(Point2D$Double) のローカル変数 result が参照している HashSet のインスタンスに
+ RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を見てきました.
ここで, 課題A4の接近過程抽出は終了です.
「オブジェクトの接近過程」ビューを全て閉じ, そのあとデバッグ実行を終了してください.

「選択された図形がArgoUMLのシステム内部でどのように管理され, 削除機能の実行によってどのように取り出されて, 削除されるか?」- ArgoUMLはオープンソースのUMLモデリングツールで, Javaで書かれております.
現在は, 呼び出し元である FigNodeModelElement クラスの removeFromDiagramImpl() メソッドを見ています.
- ここで, 変数ビューを見ると, このメソッドも先ほどと同様に FigClass クラスのインスタンス (id = 1675174935) によって呼び出されていることがわかります.
+ ここで, 変数ビューを見ると, このメソッドも先ほどと同様に FigClass クラスのインスタンス (id = 1675174935) に対して呼び出されていることがわかります.
これを確認したら, 呼び出しスタック上でさらに1つ呼び出し元をクリックしてください.


- 89行目では, FigClass クラスのインスタンス (id = 1675174935) のメソッドが呼び出されていることがわかります.
+ 変数ビュー上にある「呼び出し前」を開くと, 89行目からは, FigClass クラスのインスタンス (id = 1675174935) のメソッドが呼び出されていることがわかります.
この FigClass クラスのインスタンスがどこから来たのかを確認するために, ステップバックオーバーを3回押して, 86行目の拡張for文まで戻ってください.
- ここで FigClass クラスのインスタンスは Figクラスを参照するリストであるローカル変数 figs から拡張for文で取得されてきたことがわかります.
- ここからは, FigClass クラスのインスタンスを参照していた figs がどこから来たのかと, figs にそのインスタンスがどこで追加されたのかを見ていきます.
+ ここで FigClass クラスのインスタンスは, ローカル変数 figs によって参照されているリストから, 拡張for文によって取得されてきたことがわかります.
+ ここからは, figs が参照しているリストがどこから来たのかと, そのリストに FigClass クラスのインスタンスがどこで追加されたのかを見ていきます.
まずは, ステップバックインを3回押して, 85行目の getFigs() メソッドの中に後ろから入ってください.



Selection クラスの getContent() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, Selection クラスの子孫クラスである SelectionClass クラスのインスタンスが
- フィールド content として FigClass クラスのインスタンス (id = 1675174935) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, Selection クラスの子孫クラスである SelectionClass クラスのインスタンスの
+ フィールド content が FigClass クラスのインスタンス (id = 1675174935) を参照していることがわかります.

先ほどの結果から, FigClass クラスのインスタンス (id = 1675174935) は SelectionClass クラスのインスタンス (id = 1672744985) が参照していることがわかりました.
次は, この SelectionClass クラスのインスタンスがどこから来たのかを見ていきます.
呼び出しスタック上で呼び出し元である SelectionManger クラスの getFigs() メソッドをクリックしてください.
- ここで, ソースコードを見ると, SelectionClass クラスのインスタンスは selections から取得していることが確認でき,
- それは SelectionManager クラスのインスタンス (id = 4310438) がフィールドとして参照していることがわかります.
+ ここで, ソースコードを見ると, SelectionClass クラスのインスタンスは, フィールド selections によって参照されているリストから取得していることが確認でき,
+ さらに変数ビュー上の this を開くと, SelectionManager クラスのインスタンス (id = 4310438) の selections フィールドによって参照されているのは,
+ ArrayList のインスタンス (id = 125345735) であることがわかります.

- 先ほどの結果から, SelectionClass クラスのインスタンス (id = 1672744985) は
- SelectionManager クラスのインスタンス (id = 4310438) が参照していることがわかりました.
+ 先ほどの結果から, SelectionClass クラスのインスタンス (id = 1672744985) は, SelectionManager クラスのインスタンス (id = 4310438) の
+ selections フィールドが参照している ArrayList のインスタンスによって管理されていることがわかりました.
次は, この SelectionManager クラスのインスタンスがどこから来たのかを見ていきます.
呼び出しスタック上でさらに呼び出し元である ActionRemoveFromDiagram クラスの actionPerformed(ActionEvent) メソッドをクリックしてください.
ここでは, ステップバックインを1回押して Editor クラスの getSelectionManager() メソッドの中に後ろから入ってください.
@@ -162,7 +163,7 @@
Editor クラスの getSelectionManager() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, この Editor クラスのインスタンスがフィールド _selectionManager として
+ ここで, 変数ビュー上の this を開くと, この Editor クラスのインスタンスのフィールド _selectionManager が
SelectionManager クラスのインスタンス (id = 4310438) を参照していることがわかります.


Globals クラスの curEditor() メソッドに入りました.
- ここで, ソースコードを見ると, Globalsクラスが static フィールド _curEditor として
+ ここで, ソースコードを見ると, Globalsクラスの static フィールド _curEditor が
Editor クラスのインスタンス (id = 371019845) を参照していることがわかります.

課題B3 (機能理解) の終了直後は下図のような状態になっているはずです.
+ ここでは, 課題B3 (機能理解) では使用しなかった逆方向バージョンのある機能を用いて, 課題B3 (機能理解) と同等の内容を理解していくことを目指します.
まずは, ActionRemoveFromDiagram クラスのインスタンスに FigClass クラスのインスタンス (id = 1675174935) が接近する過程を抽出して見ていきます.
ここで, 「実行時点の登録」ビュー上で登録している「89行目 ActionRemoveFromDiagram.actionPerformed(ActionEvent)」をダブルクリックしてください.
すると, 現在の実行時点が ActionRemoveFromDiagram クラスの actionPerformed(ActionEvent) メソッドの89行目に移ります.
@@ -28,7 +29,7 @@
先ほどの操作によって, 現在は ActionRemoveFromDiagram クラスの actionPerformed(ActionEvent) メソッドの89行目にいます.
ここで, 変数ビュー上の「呼び出し前」のメソッド名が FigNodeModelElement.removeFromDiagram() であることを確認してください.
それを確認したら, 変数ビュー上の「呼び出し前」を開いて, レシーバを右クリックしてください.
- 右クリックすると, ポップアップメニューが出てくるので,「オブジェクトの接近過程抽出」をクリックしてください.
+ 右クリックすると, ポップアップメニューが出てくるので, 「オブジェクトの接近過程抽出」をクリックしてください.

@@ -50,8 +51,9 @@
ここまでで, ActionRemoveFromDiagram クラスのインスタンスに FigClass クラスのインスタンス (id = 1675174935) が接近する過程を見てきました.
- 抽出した結果を見ると, SelectionManager クラスのインスタンス (id = 4310438) のローカル変数 figs が参照している Vector に追加されていた FigClass クラスのインスタンスを
- 取得してきていることがわかりましたが, その FigClass クラスのインスタンスがどうやって追加されたのかについては, この抽出範囲だけではわかりません.
+ 抽出した結果 (「参照先側012」と「参照先側013」) を見ると, SelectionManager#getFigs() 中のローカル変数 figs が参照している
+ Vector オブジェクトに追加された FigClass クラスのインスタンスを後で取得してきていることがわかりましたが,
+ その FigClass クラスのインスタンスが Vector オブジェクトに追加されるまでの経緯は, この抽出範囲だけではわかりません.
そこで, ここからは, そのローカル変数 figs に FigClass クラスのインスタンス (id = 1675174935) が追加されるまでの過程を見ていきます.
まずは, 「オブジェクトの接近過程抽出」ビュー上の「参照先側012」をクリックしてください.

ここで, 変数ビュー上の「呼び出し前」のメソッド名が Vector.addElement(Object) であることを確認してください.
それを確認したら, 変数ビュー上の「呼び出し前」を開いて, 引数を右クリックしてください.
- 右クリックすると, ポップアップメニューが出てくるので, 上の方の「オブジェクトの接近過程抽出」をクリックしてください.
+ 右クリックすると, ポップアップメニューが出てくるので, 上の方の Vector クラスのインスタンスと FigClass クラスのインスタンスに対する
+ 「オブジェクトの接近過程抽出」をクリックしてください.

@@ -92,8 +95,8 @@

- ここまでで, SelectionManager クラスのインスタンス (id = 4310438) のローカル変数 figs が参照している Vector に
- FigClass クラスのインスタンス (id = 1675174935) が追加されるまでの過程を見てきました.
+ ここまでで, SelectionManager#getFigs() メソッド内のローカル変数 figs が参照している Vector クラスのインスタンス
+ (id = 450474599) に FigClass クラスのインスタンス (id = 1675174935) が追加されるまでの過程を見てきました.
ここで, 課題B3の接近過程抽出は終了です.
「オブジェクトの接近過程」ビューを全て閉じてください.
なお, デバッグ実行は終了せずにそのままの状態にしておいてください.
diff --git a/courseB/ArgoUML_Reverse/problem2/ArgoUML2_Reverse.html b/courseB/ArgoUML_Reverse/problem2/ArgoUML2_Reverse.html
index 86acb63..154a30e 100644
--- a/courseB/ArgoUML_Reverse/problem2/ArgoUML2_Reverse.html
+++ b/courseB/ArgoUML_Reverse/problem2/ArgoUML2_Reverse.html
@@ -13,7 +13,7 @@
「配置された図形がArgoUMLのシステム内部でどのように管理され,選択機能の実行によってどのように取り出されて,どのように選択図形として登録されるか?」- ArgoUMLはオープンソースのUMLモデリングツールで, Javaで書かれております.
Fig クラスはグラフィックエディタ上の図形を表すGEFの内部のクラスです.
また, FigClass クラスはクラス図上に配置された「クラス」を表す ArgoUML のクラスで, Fig クラスの子孫クラスにあたります.
- 現在の実行時点の行は、図形を選択するたびに実行されます.
+ 現在の実行時点の行は, 図形を選択するたびに実行されます.
@@ -61,10 +61,11 @@

- ここで, ソースコードと変数ビューを見ると, SelectionManager クラスのインスタンス (id = 4310438) が参照するフィールド selections へは
- makeSelectionFor(Fig) メソッドの戻り値である SelectionClass クラスのインスタンス (id = 1672744985) が追加されていることがわかります.
+ ここで, ソースコードと変数ビューの List.add(Object) の呼び出し前を見ると, SelectionManager クラスのインスタンス (id = 4310438) の
+ フィールド selections へは, makeSelectionFor(Fig) メソッドの戻り値である SelectionClass クラスのインスタンス (id = 1672744985) が
+ 追加されていることがわかります.
課題B4では, このオブジェクトの追加に関わっている SelectionManager クラスのインスタンスと SelectionClass クラスのインスタンスについて見ていきます.
- まずは, SelectioClass クラスのインスタンスの方がどこから来たのかを見ていくために,
+ まずは, SelectionClass クラスのインスタンスの方がどこから来たのかを見ていくために,
ステップバックインを1回押して SelectionManager クラスの makeSelectionFor(Fig) メソッドの中に後ろから入ってください.

現在は SelectionManager クラスの addFig(Fig) メソッドの130行目を見ています.
ここで, ソースコードを見ると, 先ほどの makeSelectionFor(Fig) メソッドに実引数として渡されていた FigClass クラスのインスタンス (id = 1675174935) は,
- この SelectionManager クラスの addFig(Fig) メソッド内において, 仮引数 f で参照されている値であることがわかります
+ この SelectionManager クラスの addFig(Fig) メソッド内において, 仮引数 f で渡されてきた値であることがわかります
ここからは, この 仮引数 f で参照されている FigClass クラスのインスタンス (id = 1675174935) がどこから来たのかを見ていきます.
呼び出しスタック上で1つ呼び出し元である SelectionManager クラスの select(Fig) メソッドをクリックしてください.

Editor クラスの getLayerManager() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, この Editor クラスのインスタンス (id = 371019845) がフィールド _layerManager として
+ ここで, 変数ビュー上の this を開くと, この Editor クラスのインスタンス (id = 371019845) のフィールド _layerManager が
LayerManager クラスのインスタンス (id = 1975264229) を参照していることがわかります.
これを確認したら, ステップリターンを1回押して, 呼び出し元に戻ってください.

取得している値を確認するために, ステップオーバーを2回押して232行目まで進んでください.
- 232行目まで進んだら, 変数ビュー上の「呼び出し後」を開くと, 戻り値として FigClass クラスのインスタンス (id = 1675174935) が返されていることが確認でき,
- したがって, このインスタンスは LayerPerspectiveMutable クラスのインスタンス (id = 1248750852) がリスト内の要素として参照していることがわかります.
+ 232行目まで進んだら, 変数ビュー上の「呼び出し後」 (List.get(int) の呼び出し後) を開くと,
+ 戻り値として FigClass クラスのインスタンス (id = 1675174935) が返されていることが確認できます.
+ また, 変数ビューの this を開くと, LayerPerspectiveMutable クラスのインスタンス (id = 1248750852) の
+ contents フィールドが参照しているのは, ArrayList のインスタンス (id = 30009673) であることがわかります.

- 先ほどの結果から, FigClass クラスのインスタンス (id = 1675174935) は
- LayerPerspectiveMutable クラスのインスタンス (id = 1248750852) が参照していることがわかりました.
+ 先ほどの結果から, FigClass クラスのインスタンス (id = 1675174935) は, LayerPerspectiveMutable クラスのインスタンス (id = 1248750852) の
+ contents フィールドが参照している ArrayList のインスタンスによって管理されていることがわかりました.
ここで, ステップオーバーを1回押して, 実行時点が return f に止まることを確認してください.
これを確認したら, 呼び出しスタック上で4つ呼び出し元である ModeSelect クラスの mousePressed(MouseEvent) メソッドをクリックしてください.

現在は, ModeSelect クラスの mousePressed(MouseEvent) メソッドを見ています.
- ここで, 変数ビュー上で this を開くと, Editor クラスのインスタンス (id = 371019845) は
- ModeSelect クラスのインスタンス (id = 1807431709) が フィールド editor として参照していることがわかります.
+ ここで, 変数ビュー上で this を開くと, Editor クラスのインスタンス (id = 371019845) は,
+ ModeSelect クラスのインスタンス (id = 1807431709) のフィールド editor によって参照されていることがわかります.

ここまでの結果から, SelectionClass クラスのインスタンスに関わる各オブジェクトの関係について, 以下のことがわかりました.
Editor クラスの getSelectionManager() メソッドに入りました.
- ここで, 変数ビュー上の thisを開くと, Editor クラスのインスタンス (id = 371019845) が フィールド _selectionManager として
+ ここで, 変数ビュー上の this を開くと, Editor クラスのインスタンス (id = 371019845) の フィールド _selectionManager が
SelectionManager クラスのインスタンス (id = 4310438) を参照していることがわかります.

課題B4 (機能理解) の終了直後は下図のような状態になっているはずです.
- まずは, SelectionManager クラスのインスタンス (id = 4310438) のフィールド selections が参照している ArrayList に
+ ここでは, 課題B4 (機能理解) では使用しなかった逆方向バージョンのある機能を用いて, 課題B4 (機能理解) と同等の内容を理解していくことを目指します.
+ まずは, SelectionManager クラスのインスタンス (id = 4310438) のフィールド selections が参照している ArrayList のインスタンスに
SelectionClass クラスのインスタンス (id = 1672744985) が追加されるまでの過程を見ていきます.
ここで, 「実行時点の登録」ビュー上で登録している「130行目 SelectionManager.addFig(Fig)」をダブルクリックしてください.
すると, 現在の実行時点が SelectionManager クラスの addFig(Fig) メソッドの130行目に移ります.
@@ -28,7 +29,8 @@
ここで, 変数ビュー上の「呼び出し前」のメソッド名が List.add(Object) であることを確認してください.
それを確認したら, 変数ビュー上の「呼び出し前」を開いて, 引数を右クリックしてください.
- 右クリックすると, ポップアップメニューが出てくるので, 上の方の「オブジェクトの接近過程抽出」をクリックしてください.
+ 右クリックすると, ポップアップメニューが出てくるので, 上の方の ArrayList クラスのインスタンスと
+ SelectionClass のインスタンスを対象とした「オブジェクトの接近過程抽出」をクリックしてください.

diff --git a/courseB/CourseDescriptionB.html b/courseB/CourseDescriptionB.html
index 5cc980a..0111b00 100644
--- a/courseB/CourseDescriptionB.html
+++ b/courseB/CourseDescriptionB.html
@@ -17,7 +17,7 @@
この度は私共の実験にご協力頂きまして誠にありがとうございます.
- これから行っていただく作業は,4つの課題とアンケートへの回答です.全体の作業時間としては,5~6時間程度を想定しています.
+ これから行っていただく作業は,4つの課題とアンケートへの回答です.全体の作業時間としては,5~7時間程度を想定しています.
実験に入る前にAmazon EC2インスタンスにログインしていただき,実験で使用するトレースデバッガの操作の練習を行っていただきます.
実験では,2つのオープンソースプログラムの4つの機能を対象に4つの課題に取り組んでいただきます.
これ以降お答えいただくアンケートは実験中に8個と,最後に1つの計9個あります.
@@ -28,7 +28,7 @@
いよいよ実験に入っていきます.
トレースデバッガの操作に要した時間を測っていただきますので,お手元に時計をご用意ください.
- 時間計測にあたって,急いで操作していただく必要はまったくありません.最初の課題から最後の課題まで同じペースで操作することを意識してください.
+ 時間計測にあたって,急いで操作していただく必要はまったくありません.
+ 最初の課題から最後の課題まで一定のペースで, 課題の内容を理解しながら操作することを意識してください.
まず,JHotDrawの説明をお読みいただき,JHotDrawに関する課題B1と課題B2に取り組んでいただきます.
その後,ArgoUMLの説明をお読みいただき,ArgoUMLに関する課題B3と課題B4に取り組んでいただきます.
課題B1, B2では順方向バージョン,課題B3, B4では逆方向バージョンのトレースデバッガをお使いいただきます.
diff --git a/courseB/JHotDraw_Forward/problem1/JHotDraw1_Forward.html b/courseB/JHotDraw_Forward/problem1/JHotDraw1_Forward.html
index fd75b49..be97bc3 100644
--- a/courseB/JHotDraw_Forward/problem1/JHotDraw1_Forward.html
+++ b/courseB/JHotDraw_Forward/problem1/JHotDraw1_Forward.html
@@ -13,7 +13,7 @@
「選択された図形がJHotDrawのシステム内部でどのように管理され,図形移動機能の実行によってどのように取り出されて,移動していくか?」- JHotDrawはオープンソースの図形描画ツールで, Javaで書かれております.
+ Figure クラスは図形を表す JHotDraw のクラスです.
+ また, RectangleFigure クラスは矩形を表す JHotDraw のクラスで, Figure クラスの子孫クラスにあたります.
ブレークポイントを置いた行は、図形を移動するたびに実行されます.

@@ -87,7 +89,7 @@
ここで, いったんデバッグ実行を終了してから, ブレークポイントビュー上にある「ブレークポイントをEclipseから取り入れる」アイコンを押してください.
そのあと, 再びデバッグ実行すると今度は118行目に止まります.
- ステップインを2回押してから変数ビュー上の「呼び出し前」を開いて引数のオブジェクトのIDを確認してください.
+ ステップインを2回押してから変数ビュー上の「呼び出し前」 (HashSet.add(Object) の呼び出し前) を開いて引数のオブジェクトのIDを確認してください.
すると, 先ほど確認した RectangleFigure クラスのインスタンス (id = 1952912699) がここで追加されていることがわかります.

再び再開ボタンを押すと, 今度は159行目に止まります.
ここで, 変数ビューの「呼び出し前」を開いてレシーバのIDを見ると, 先ほどの RectangleFigure クラスのインスタンス (id = 1952912699) と同一であることが確認できます.
- したがって, ここでは直前に止まっていた2回目の118行目で追加した RectangleFigure クラスのインスタンスを取得していることがわかります.
+ したがって, ここでは直前に止まっていた118行目の2回目の実行で追加した RectangleFigure クラスのインスタンスを取得していることがわかります.
それを確認したら, ここでいったんデバッグ実行を終了してください.

ソースコードを見ると, 116行目の拡張for文で DrawingView クラスの getSelectedFigures() メソッドを呼び出し,
- その戻り値のコレクションから取得してきた RectangleFigure クラスのインスタンスを, 118行目で selectedFigures に追加していることがわかります.
- そこで, 次はこの view がどこから来たのかと, getSelectedFigures() メソッドの戻り値がどうなっているのかを見ていきます.
+ その戻り値のコレクションから取得してきた RectangleFigure クラスのインスタンスを, 118行目で transformedFigures に追加していることがわかります.
+ そこで, 次はこの view がどこから来たのかと, getSelectedFigures() メソッドの戻り値がどうやって来たのかを見ていきます.
98行目と116行目にブレークポイントを入れ, ブレークポイントビュー上にある「ブレークポイントをEclipseから取り入れる」アイコンを押してください.
そのあと, 再びデバッグ実行すると, まずは98行目で止まることを確認してください.

先ほどの実行によって, 現在は98行目に止まっているはずです.
この状態で再開ボタンを押していくと, 現在の実行時点が 116行目 → 118行目 → 98行目 → 116行目 → 118行目と移り変わることを確認してください.
- この操作によって, 98行目と116行目と118行目はそれぞれ2回ずつ実行されていることが確認でき, したがって, 2回目に止まった方が直前に実行されたものだとわかります.
- ここでいったんデバッグ実行を終了して下さい.
+ この操作によって, 98行目と116行目と118行目はそれぞれ2回ずつ実行されていることが確認でき, したがって,
+ 98行目も116行目も2回目に止まった方が直前に実行されたものだとわかります. ここでいったんデバッグ実行を終了して下さい.
- そのままの状態で再びデバッグ実行し, 再開ボタンを3回押して2回目の98行目に止まって下さい.
+ そのままの状態で再びデバッグ実行し, 再開ボタンを3回押して98行目の2回目の実行に止まって下さい.
ここで, ステップインを1回押して getView() メソッドの中に入ってください.

AbstractTool クラスの getView() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDragTracker クラスのインスタンス(id = 758826749) が
- フィールド editor として DefaultDrawingEditor クラスのインスタンス (id = 1859859960) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DefaultDragTracker クラスのインスタンス(id = 758826749) の
+ フィールド editor が DefaultDrawingEditor クラスのインスタンス (id = 1859859960) を参照していることがわかります.
これを確認したら, ステップインを3回押して getActiveView() メソッドの中に入ってください.

DefaultDrawingEditor クラスの getActiveView() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) が
- フィールド activeView として DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) の
+ フィールド activeView が DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.
これを確認したら, ステップリターンを1回押して呼び出し元に戻ってください.
(このとき, 2つ呼び出し元である DefaultDragTracker クラスの mousePressed(MouseEvent) メソッドまで戻ることに注意してください)

DefaultDrawingView クラスの getSelectedFigures() メソッドの中に入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDrawingView クラスのインスタンス (id = 150367587) が
- フィールド selectedFigures として LinkedHashSet を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DefaultDrawingView クラスのインスタンス (id = 150367587) の
+ フィールド selectedFigures が LinkedHashSet のインスタンスを参照していることがわかります.
また, ソースコードを見ると, Collections クラスの static メソッドである unmodifiableSet(Set) が呼び出されており,
その引数として フィールド selectedFigures が渡されていることが確認できます.
+ この Collections#unmodifiableSet(Set) は引数として渡されたセットを Collections$UnmodifiableSet のインスタンスに変換して返すメソッドです.
これを確認したら, 呼び出しスタック上で1つ呼び出し元をクリックしてください.

課題B1 (機能理解) の終了直後は下図のような状態でデバッグ実行が終了しているはずです.
デバッグ実行が終了していることを確認したら, 右上にあるパースペクティブを右クリックし, いったん「トレースデバッガ(順方向)」のパースペクティブを閉じてください.
+ ここでは, 課題B1 (機能理解) では使用しなかった逆方向バージョンのある機能を用いて, 課題B1 (機能理解) と同等の内容を理解していくことを目指します.

@@ -32,12 +33,12 @@

現在は, DefaultDragTracker クラスの mousePressed(MouseEvent) メソッドの118行目にいます.
- まずは, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド transformedFigures が参照している HashSet に
+ まずは, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド transformedFigures が参照している HashSet のインスタンスに
RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を抽出して見ていきます.
ここで, ステップネクストを2回押してください.

ここで, 変数ビュー上の「呼び出し前」のメソッド名が HashSet.add(Object) であることを確認してください.
それを確認したら, 変数ビュー上の「呼び出し前」を開いて, 引数を右クリックしてください.
- 右クリックすると, ポップアップメニューが出てくるので, 上の方の「オブジェクトの接近過程抽出」をクリックしてください.
+ 右クリックすると, ポップアップメニューが出てくるので, 上の方の HashSet のインスタンスと RectangleFigure のインスタンスを
+ 対象とした「オブジェクトの接近過程抽出」をクリックしてください.

@@ -71,8 +73,8 @@

- ここまでで, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド transformedFigures が参照している HashSet に
- RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を見てきました.
+ ここまでで, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド transformedFigures が参照している
+ HashSet のインスタンスに, RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を見てきました.
ここで, 課題B1の接近過程抽出は終了です.
「オブジェクトの接近過程」ビューを全て閉じ, そのあとデバッグ実行を終了してください.
デバッグ実行を終了したら, この「トレースデバッガ(逆方向)」のパースペクティブを閉じてください.
diff --git a/courseB/JHotDraw_Forward/problem1/images/images_problem1/JHotDraw_1_05.png b/courseB/JHotDraw_Forward/problem1/images/images_problem1/JHotDraw_1_05.png
index e776b23..7cc12c9 100644
--- a/courseB/JHotDraw_Forward/problem1/images/images_problem1/JHotDraw_1_05.png
+++ b/courseB/JHotDraw_Forward/problem1/images/images_problem1/JHotDraw_1_05.png
Binary files differ
diff --git a/courseB/JHotDraw_Forward/problem1/images/images_problem1/JHotDraw_1_08.png b/courseB/JHotDraw_Forward/problem1/images/images_problem1/JHotDraw_1_08.png
index 18d79c1..81357f9 100644
--- a/courseB/JHotDraw_Forward/problem1/images/images_problem1/JHotDraw_1_08.png
+++ b/courseB/JHotDraw_Forward/problem1/images/images_problem1/JHotDraw_1_08.png
Binary files differ
diff --git a/courseB/JHotDraw_Forward/problem1/images/images_problem1_pre/JHotDraw_1_pre_09.png b/courseB/JHotDraw_Forward/problem1/images/images_problem1_pre/JHotDraw_1_pre_09.png
index ed48dc7..c56f198 100644
--- a/courseB/JHotDraw_Forward/problem1/images/images_problem1_pre/JHotDraw_1_pre_09.png
+++ b/courseB/JHotDraw_Forward/problem1/images/images_problem1_pre/JHotDraw_1_pre_09.png
Binary files differ
diff --git a/courseB/JHotDraw_Forward/problem2/JHotDraw2_Forward.html b/courseB/JHotDraw_Forward/problem2/JHotDraw2_Forward.html
index e56fcdd..9265606 100644
--- a/courseB/JHotDraw_Forward/problem2/JHotDraw2_Forward.html
+++ b/courseB/JHotDraw_Forward/problem2/JHotDraw2_Forward.html
@@ -13,7 +13,7 @@
「配置された図形がJHotDrawのシステム内部でどのように管理され,図形選択機能の実行によってどのように取り出されて,どのように選択図形として登録されるか?」- JHotDrawはオープンソースの図形描画ツールで, Javaで書かれております.
デバッグ実行してください.
すると, まずは DefaultDragTracker クラスの mousePressed(MouseEvent) メソッドの98行目で実行時点が一時停止します.
- そのまま, 再開ボタンを4回押して, 2回目の DefaultDragTracker クラスの mousePressed(MouseEvent) メソッドの116行目にまで進んでください.
+ そのまま, 再開ボタンを4回押して, DefaultDragTracker クラスの mousePressed(MouseEvent) メソッド116行目の2回目の実行にまで進んでください.
ここで, ステップインを押して DefaultDrawingView クラスの getSelectedFigures() メソッドの中に入ってください.


先ほどの操作によって, 現在は DefaultDrawingView クラスの getSelectedFigures() メソッドの931行目にいます.
- ここで, フィールド selectedFigures に RectangleFigure クラスのインスタンス (id = 1952912699) を実際に追加しているのはどこなのかを見ていきます.
+ ここで, フィールド selectedFigures が参照している LinkedHashSet クラスのインスタンス (id = 1787265837) に,
+ RectangleFigure クラスのインスタンス (id = 1952912699) を実際に追加しているのはどこなのかを見ていきます.
ソースコード中の selectedFigures にカーソルを入れ, そのフィールドに対してオブジェクトを追加している全ての行にブレークポイントを入れてください.
今回は, DefaultDrawingView クラスの780行目と815行目と889行目の三か所が該当します.


- ブレークポイントを置いた行は、図形を選択するたびに実行されます.
+ Figure クラスは図形を表す JHotDraw のクラスです.
+ また, RectangleFigure クラスは矩形を表す JHotDraw のクラスで, Figure クラスの子孫クラスにあたります.
+ ブレークポイントを置いた行は、図形を選択するたびに実行されます.
+ この行が2回実行される理由は, 矩形配置機能で配置された矩形が選択状態になるときに, まず1回目の実行が行われるためです.
@@ -81,8 +85,8 @@
先ほどの前準備にしたがって進めていくと, 下図のように DefaultDrawingView クラスの
addToSelection(Figure) メソッド内の780行目で一時停止している状態になっているはずです.
この状態になっていれば, ここから時間計測を開始してください. 時間計測はできる限り,1分以内の単位での計測をお願いします.
- DefaultDrawingView クラスの addToSelection(Figures) メソッドの780行目では, フィールド selectedFigures に
- 仮引数 f で参照される RectangleFigure クラスのインスタンス (id = 1952912699) を追加していることが確認できます.
+ DefaultDrawingView クラスの addToSelection(Figures) メソッドの780行目では, フィールド selectedFigures が参照しているセットに
+ 仮引数 figure が参照している RectangleFigure クラスのインスタンス (id = 1952912699) を追加していることが確認できます.

@@ -91,8 +95,8 @@
ここで, 変数ビュー上で「呼び出し前」および this を開いてオブジェクトのIDを確認してください.
すると, view の値は DefaultDrawingView クラスのインスタンス (id = 150367587) であり,
addToSelection(Figure) メソッドの引数には RectangleFigure クラスのインスタンス (id = 1952912699) が渡されていることが確認できます.
- また, この RectangleFigure クラスのインスタンス (id = 1952912699) は DefaultDragTracker クラスのインスタンス (id = 758826749) が
- フィールド anchorFigure として参照しているものだとわかります.
+ また, この RectangleFigure クラスのインスタンス (id = 1952912699) は, DefaultDragTracker クラスのインスタンス (id = 758826749) の
+ フィールド anchorFigure によって参照されていることがわかります.

@@ -110,27 +114,27 @@
AbstractTool クラスの getView() メソッドの中に入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDragTracker クラスのインスタンス(id = 758826749) が
- フィールド editor として DefaultDrawingEditor クラスのインスタンス (id = 1859859960) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DefaultDragTracker クラスのインスタンス(id = 758826749) の
+ フィールド editor が DefaultDrawingEditor クラスのインスタンス (id = 1859859960) を参照していることがわかります.
これを確認したら, ステップインを3回押して getActiveView() メソッドの中に入ってください.

DefaultDrawingEditor クラスの getActiveView() メソッドの中に入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) が
- フィールド activeView として DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) の
+ フィールド activeView が DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.
これを確認したら, 呼び出しスタック上で2つ呼び出し元をクリックしてください.

現在は DefaultDragTracker クラスの mousePressed(MouseEvent) メソッドの98行目を見ています.
ここで, 変数ビュー上で this を開いて, フィールド anchorFigure と this 自体のIDを確認してください.
- DefaultDragTracker クラスのインスタンス (id = 758826749) が フィールド anchorFigure として
+ DefaultDragTracker クラスのインスタンス (id = 758826749) の フィールド anchorFigure が
RectangleFigure クラスのインスタンス (id = 1952912699) を参照していることが確認できます.

- ここからは, このフィールド anchorFigure に RectangleFigure クラスのインスタンスが代入された時点を見ていきます.
+ ここからは, このフィールド anchorFigure に RectangleFigure クラスのインスタンスへの参照が代入された時点を見ていきます.
ソースコード中の anchorFigure にカーソルを入れて, ソースコード中で代入しているところ全てにブレークポイントを入れてください.
今回は, DefaultDragTracker クラスの84行目と218行目の二か所が該当します.

デバッグ実行をいったん終了してから, 再びデバッグ実行してください.
そのあと, 再開ボタンを1回押して DefaultDragTracker クラスの setDraggedFigure(Figure) メソッドの218行目にまで進んでください.
- ここで, 変数ビューを見て this と 引数の f のIDをそれぞれ確認してください.
+ ここで, 変数ビューを見て this (id = 758826749) と 引数の f (id = 1952912699) のIDをそれぞれ確認してください.
これを確認したら, 呼び出しスタック上で1つ呼び出し元をクリックしてください.

現在は, 呼び出し元である SelectionTool クラスの mousePressed(MouseEvent) メソッドを見ています.
ここで, 変数ビュー上で「呼び出し前」を開いて引数と, this を開いてフィールド dragTracker のIDをそれぞれ確認してください.
- すると, 先ほどの DefaultDragTracker クラスのインスタンス (id = 758826749) を フィールド dragTracker として
- DelegationSelectionTool クラスのインスタンス (id = 599587451) が参照していることが確認できます.
+ すると, 先ほどの DefaultDragTracker クラスのインスタンス (id = 758826749) を, DelegationSelectionTool クラスの
+ インスタンス (id = 599587451) のフィールド dragTracker が参照していることが確認できます.

@@ -179,7 +183,7 @@
SelectionTool クラスの setTracker(Tool) メソッドに入りました.
ここでは, ステップオーバーを4回押して301行目まで進めてください.
- そのあと, 変数ビュー上で this を開くと, フィールド tracekr の値が 仮引数 newTracker と同じ値に更新されていることがわかります.
+ そのあと, 変数ビュー上で this を開くと, フィールド tracker の値が 仮引数 newTracker と同じ値に更新されていることがわかります.
これを確認したら, ステップリターンを1回押して呼び出し元に戻ってください.


DefaultDragTracker クラスの mousePressed(MouseEvent) メソッドに入りました.
- ここで, 変数ビュー上で this を開いて, フィールド anchorFigure と this 自体のIDを確認してください.
+ ここで, 変数ビュー上で this を開いて, フィールド anchorFigure (id = 1952912699) と this (id = 758826749) のIDを確認してください.

@@ -215,7 +219,7 @@
いったんデバッグ実行を終了してから, もう一度デバッグ実行してください.
- そのあと, 再開ボタンを2回押して, 2回目の235行目にまで進んでください.
+ そのあと, 再開ボタンを2回押して, 235行目の2回目の実行にまで進んでください.

@@ -230,7 +234,7 @@
先ほどの操作によって, ローカル変数 figure に値を代入した箇所がわかりました.
ここで, いったんデバッグ実行を終了してから, 再びデバッグ実行してください.
- まずは DefaultDrawingViewクラスの addToSelection(Figure) メソッドの780行目で止まるので, 再開ボタンを2回押して2回目の235行目にまで進んでください.
+ まずは DefaultDrawingViewクラスの addToSelection(Figure) メソッドの780行目で止まるので, 再開ボタンを2回押して235行目の2回目の実行にまで進んでください.
そのあと, ステップオーバーを8回押して270行目にまで進み, ステップインを3回押して findFigure(Point) メソッドの中に入ってください.

DefaultDrawingView クラスの getDrawing() メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDrawingView クラスのインスタンス (id = 150367587) が
- フィールド drawing として QuadTreeDrawing クラスのインスタンス (id = 1583174451) のインスタンスを参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DefaultDrawingView クラスのインスタンス (id = 150367587) の
+ フィールド drawing が QuadTreeDrawing クラスのインスタンス (id = 1583174451) を参照していることがわかります.
これを確認したら, ステップリターンを1回押して呼び出し元に戻ってください.

DefaultDrawingView クラスの findFigure(Point) メソッドに戻ってきました.
- ソースコードを見ると, 先ほどの getDrawing() メソッドで取得してきた QuadTreeDrawing クラスのインスタンスに対して findFigure(Point2D$Double) メソッドが呼び出され,
- その引数として, DefaultDrawingView クラスの viewToDrawing(Point) メソッドの戻り値が渡されていることが確認できます.
+ ソースコードを見ると, 先ほどの getDrawing() メソッドで取得してきた QuadTreeDrawing クラスのインスタンスに対して
+ findFigure(Point2D$Double) メソッドが呼び出されていることが確認できます.
次は, ステップインを1回押して, viewToDrawing(Point) メソッドの中に入ってください.

DefaultDrawingView クラスの findFigure(Point) メソッドに戻ってきました.
- ステップインを1回押して QuadTreeDrawing クラスの findContains(Point2D$Double) メソッドの中に入ってください.
+ ステップインを1回押して QuadTreeDrawing クラスの findFigure(Point2D$Double) メソッドの中に入ってください.

- QuadTreeDrawing クラスの findContains(Point2D$Double) メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, QuadTreeDrawing クラスのインスタンス (id = 1583174451) が,
- フィールド quadTree として QuadTree クラスのインスタンス (id = 808853315) を参照していることがわかります.
+ QuadTreeDrawing クラスの findFigure(Point2D$Double) メソッドに入りました.
+ ここで, 変数ビュー上の this を開くと, QuadTreeDrawing クラスのインスタンス (id = 1583174451) の
+ フィールド quadTree が QuadTree クラスのインスタンス (id = 808853315) を参照していることがわかります.
これを確認したら, ステップインを3回押して, QuadTree クラスの findContains(Point2D$Double) メソッドの中に入ってください.

QuadTree クラスの findContains(Point2D$Double) メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, QuadTree クラスのインスタンス (id = 808853315) がフィールド root として
+ ここで, 変数ビュー上の this を開くと, QuadTree クラスのインスタンス (id = 808853315) のフィールド root が
QuadTree クラスの内部クラスである QuadNode クラスのインスタンス (id = 2120356010) を参照していることがわかります.
また, ソースコードを見ると, 82行目で生成された HashSet がローカル変数 result に代入されたあと,
83行目ではいったん呼び出し先に引数として渡され, 最終的には89行目で戻り値として返されていることが確認できます.
@@ -281,18 +285,19 @@
QuadNode クラスの findContains(Point2D$Double, HashSet) メソッドに入りました.
- ここで, 変数ビュー上の this を開くと, QuadNode クラスのインスタンス (id = 2120356010) が
- フィールド objects として HashMap を参照していることがわかります.
- また, ソースコードを見ると, 224行目の拡張for文でこの HashMap から取り出してきた要素を, 226行目で仮引数 result に追加していることが確認できます.
+ ここで, 変数ビュー上の this を開くと, QuadNode クラスのインスタンス (id = 2120356010) の
+ フィールド objects が HashMap のインスタンスを参照していることがわかります.
+ また, ソースコードを見ると, 224行目の拡張for文でこの HashMap から取り出してきたキー側の要素を,
+ 226行目で仮引数 result によって参照されているHashSet のインスタンスに追加していることが確認できます.
ここでは, ステップオーバーを3回押して226行目にまで進んでください.

先ほどの操作によって, 現在は226行目にいます.
ここでは, ステップインを2回押してください.
- そのあと, 変数ビュー上の「呼び出し前」を開き, 引数のIDを確認してください.
+ そのあと, 変数ビュー上の「呼び出し前」 (HashSet.add(Object) の呼び出し前) を開き, 引数のIDを確認してください.
すると, RectangleFigure クラスのインスタンス (id = 1952912699) が引数として渡されており,
- それが 仮引数 result に対して追加されることがわかります.
+ それが 仮引数 result によって参照されているHashSet のインスタンスに追加されることがわかります.
これを確認したら, ステップオーバーを4回押して呼び出し元に戻ってください.

呼び出し元である QuadTreeDrawing クラスの findContains(Point2D$Double) メソッドに戻ってきました.
ここでは, ステップオーバーを2回押して130行目にまで進めてください
- ここで, 変数ビュー上の「呼び出し後」を開いて戻り値のIDを確認してください.
+ ここで, 変数ビュー上の「呼び出し後」 (Iterator.next() の呼び出し後) を開いて戻り値のIDを確認してください.
すると, 先ほどの RectangleFigure クラスのインスタンス (id = 1952912699) を取得していることがわかります.
これを確認したら, 呼び出しスタック上で2つ呼び出し元をクリックしてください.

いったんデバッグ実行を終了してから, 再びデバッグ実行してください.
- そのあと, 再開ボタンを3回押して, 2回目の228行目にまで進んでください.
+ そのあと, 再開ボタンを3回押して, 228行目の2回目の実行にまで進んでください.
ここで, ステップインを1回押して, getView() メソッドの中に入ってください.

AbstractTool クラスの getView() メソッドの中に入りました.
- ここで, 変数ビュー上の this を開くと, DelegationSelectionTool クラスのインスタンス(id = 599587451) が
- フィールド editor として DefaultDrawingEditor クラスのインスタンス (id = 1859859960) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DelegationSelectionTool クラスのインスタンス(id = 599587451) の
+ フィールド editor が DefaultDrawingEditor クラスのインスタンス (id = 1859859960) を参照していることがわかります.
これを確認したら, ステップインを3回押して getActiveView() メソッドの中に入ってください.

DefaultDrawingEditor クラスの getActiveView() メソッドの中に入りました.
- ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) が
- フィールド activeView として DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.
+ ここで, 変数ビュー上の this を開くと, DefaultDrawingEditor クラスのインスタンス (id = 1859859960) の
+ フィールド activeView が DefaultDrawingView クラスのインスタンス (id = 150367587) を参照していることがわかります.
これを確認したら, 呼び出しスタック上で2つ呼び出し元をクリックして戻ってください.

課題B2 (機能理解) の終了直後は下図のような状態でデバッグ実行が終了しているはずです.
デバッグ実行が終了していることを確認したら, 右上にあるパースペクティブを右クリックし, いったんパースペクティブを閉じてください.
+ ここでは, 課題B2 (機能理解) では使用しなかった逆方向バージョンのある機能を用いて, 課題B2 (機能理解) と同等の内容を理解していくことを目指します.

@@ -28,10 +29,10 @@
その状態のままで, ブレークポイントビュー上にある「ブレークポイントをEclipseから取り入れる」をクリックしてください.
ブレークポイントを取り入れたら, DefaultDrawingView クラスの addToSelection(Figure) メソッドの780行目以外のブレークポイントのチェックを外してください.
チェックを外したら, デバッグ実行してください.
- まずは, DefaultDrawingView クラスのインスタンス (id = 150367587) のフィールド selectedFigures が参照している LinkedHashSet に
+ まずは, DefaultDrawingView クラスのインスタンス (id = 150367587) のフィールド selectedFigures が参照している LinkedHashSet のインスタンスに
RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を見ていきます.
デバッグ実行したら, 再開ボタンを1回押してください.
- すると, 現在の実行時点が, 2回目の DefaultDrawingView クラスの addToSelection(Figure) メソッドの780行目に移ります.
+ すると, DefaultDrawingView クラスの addToSelection(Figure) メソッド780行目の2回目の実行にまで進みます.
ここで, ステップネクストを1回押してください.


ここで, 変数ビュー上の「呼び出し前」のメソッド名が Set.add(Object) であることを確認してください.
それを確認したら, 変数ビュー上の「呼び出し前」を開いて, 引数を右クリックしてください.
- 右クリックすると, ポップアップメニューが出てくるので, 上の方の「オブジェクトの接近過程抽出」をクリックしてください.
+ 右クリックすると, ポップアップメニューが出てくるので, 上の方の LinkedHashSet のインスタンスと RectangleFigure の
+ インスタンスを対象とした「オブジェクトの接近過程抽出」をクリックしてください.

@@ -65,10 +67,11 @@

- ここまでで, DefaultDrawingView クラスのインスタンス (id = 150367587) のフィールド selectedFigures が参照している LinkedHashSet に
+ ここまでで, DefaultDrawingView クラスのインスタンス (id = 150367587) のフィールド selectedFigures が参照している LinkedHashSet のインスタンスに
RectangleFigure クラスのインスタンス (id = 1952912699) が接近する過程を見てきました.
- 抽出した結果を見ると, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド anchorFigure に代入されていた RectangleFigure クラスのインスタンスを
- 取得してきていることがわかりましたが, その RectangleFigure クラスのインスタンスがどうやって代入されたのかについては, この抽出範囲だけではわかりません.
+ 抽出した結果を見ると, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド anchorFigure に代入されていた
+ RectangleFigure クラスのインスタンスを取得してきていることがわかりましたが, その RectangleFigure クラスのインスタンスの参照が
+ anchorFigure フィールドに代入されるまでの経緯については, この抽出範囲だけではわかりません.
そこで, ここからは, DefaultDragTracker クラスのインスタンス (id = 758826749) に RectangleFigure クラスのインスタンス (id = 1952912699) が
接近する過程を抽出して見ていきます.
まずは, 「オブジェクトの接近過程抽出」ビュー上の「参照先側002」をクリックしてください.
@@ -112,8 +115,9 @@
ここまでで, DefaultDragTracker クラスのインスタンス (id = 758826749) に RectangleFigure クラスのインスタンス (id = 1952912699) が接近する過程を見てきました.
- 抽出した結果を見ると, QuadTree クラスのインスタンス (id = 808853315) のローカル変数 result に追加されていた RectangleFigure クラスのインスタンスを
- 取得してきていることがわかりましたが, RectangleFigure クラスのインスタンスがどうやって追加されたのかについては, この抽出範囲だけではわかりません.
+ 抽出した結果 (「参照先側022」と「参照先側023」) を見ると, QuadTree#findContents(Point2D$Double) のローカル変数 result が参照している
+ HashSet オブジェクトに追加された RectangleFigure クラスのインスタンスを取得してきていることがわかりましたが,
+ その RectangleFigure クラスのインスタンスが HashSet オブジェクトに追加されるまでの経緯は, この抽出範囲だけではわかりません.
そこで, ここからは, そのローカル変数 result に RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を見ていきます.
まずは, 「オブジェクトの接近過程抽出」ビュー上の「参照先側028」をクリックしてください.


@@ -163,7 +168,7 @@

- ここまでで, QuadTree クラスのインスタンス (id = 808853315) のローカル変数 result に
+ ここまでで, QuadTree#findContents(Point2D$Double) のローカル変数 result が参照している HashSet のインスタンスに
RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を見てきました.
ここで, 課題B2の接近過程抽出は終了です.
「オブジェクトの接近過程」ビューを全て閉じ, そのあとデバッグ実行を終了してください.
diff --git a/tools/Forward/TraceDebugger_Forward.html b/tools/Forward/TraceDebugger_Forward.html
index 2f85f3b..5575107 100644
--- a/tools/Forward/TraceDebugger_Forward.html
+++ b/tools/Forward/TraceDebugger_Forward.html
@@ -33,14 +33,14 @@
- トレースデバッガでは, 実行時のプログラム内部の情報を記録したファイルであるトレースファイルを読み込み, その読み込んだトレースを元にデバッグ実行を行うことができます.
+ トレースデバッガでは, 実行時のプログラム内部の情報を時系列に記録したファイルであるトレースファイルを読み込み, その読み込んだトレースを元にデバッグ実行を再現することができます.
通常のデバッガと比較するとトレースデバッガには以下のような特徴があります.


- ブレークポイントを生成したら, 右下のブレークポイントビューの「デバッグ」アイコンをクリックすると, 実際にデバッグ実行が開始されます.
- 最初は, 有効なブレークポイントが入っている行のうち, 時系列上で最初に遭遇する行まで実行が進み, そこで実行が一時停止します.
+ ブレークポイントを生成したら, 右下のブレークポイントビューの「デバッグ」アイコンをクリックすると, トレースデバッガのデバッグ実行が開始されます.
+ 最初は, 有効なブレークポイントが入っている行のうち, トレースの時系列上で最初に遭遇する行まで実行が進み, そこで実行が一時停止します.
ここでは, D クラスの passB(B) メソッドの6行目が該当しているため, そこまで実行が進んだ状態で一時停止しています.


再びデバッグアイコンをクリックしてデバッグ実行し, D.java の6行目で一時停止している状態にしてください.
- デバッグ実行中の状態で, 右下のブレークポイントビューの「再開」アイコンをクリックすると, 有効なブレークポイントが入っている行のうち,
- 現在の実行時点よりも後で最初に遭遇するブレークポイントにまで実行が進み, そこで実行が再び一時停止します.
+ 一時停止の状態で, 右下のブレークポイントビューの「再開」アイコンをクリックすると, 有効なブレークポイントが入っている行のうち,
+ 現在の実行時点以降で最初に遭遇する行にまで実行が進み, そこで実行が再び一時停止します.
もし, 該当するブレークポイントがなかった場合は, そのままデバッグ実行が終了します.
ここでは, E クラスの setC(C) メソッドの7行目が該当しているため, そこまで実行が進んだ状態で一時停止します.

いったん終了アイコンを押してデバッグ実行を終了したあと, 再びデバッグアイコンをクリックしてデバッグ実行し, D.java の6行目で一時停止している状態にしてください.
- 左上の呼び出しスタックビューには, 現在一時停止している行をトップとしたメソッド呼び出しのスタックが表示されています.
- 表示されているメソッドシグ二チャをクリックすることで, 呼び出し元のスタックフレームや呼び出し先のスタックフレームを見ることができます.
+ 左上の呼び出しスタックビューには, 現在一時停止しているメソッドをトップとしたメソッド呼び出し列のスタックが表示されています.
+ 表示されているメソッドシグ二チャをクリックすることで, 呼び出し元のスタックフレームや呼び出し先のスタックフレームを見ることができ, エディタに表示されているソースコードも連動して切り替わります.


- いったん左上の呼び出しスタックビュー上で呼び出し先である「D.passB(B) 行: 6」を選択し, エディタ上で D.java が開いている状態にしてください.
- トレースデバッガでは, トレースファイルに記録されたステートメント単位の実行時情報を元に, 実行を少しずつ進めていくことができます.
- ここで, このステートメント単位は行単位よりも細かい粒度になっていることに注意してください.
+ もう一度, 呼び出しスタックビュー上のスタックトップにある「D.passB(B) 行: 6」を選択し, エディタ上で D.java が開いている状態にしてください.
+ トレースデバッガでは, トレースファイルにステートメント単位で記録された実行時情報を元に, 実行を少しずつ進めていくことができます.
+ ここで, ステートメントは行よりも細かい単位であることに注意してください.
右下のブレークポイントビューの「ステップオーバー」アイコンをクリックすると, 実行を行単位で進めます.
なお, 呼び出し先のメソッドがあったとしても, その呼び出し先のメソッドに入ることはありません.
ここでは, ステップオーバーによって, D クラスの passB(B) メソッドの6行目から7行目へと実行を進めます.
@@ -152,7 +152,9 @@
いったん終了アイコンをクリックしてデバッグ実行を終了したあと, 再びデバッグアイコンをクリックしてデバッグ実行し, D.java の6行目で一時停止している状態にしてください.
- 右上の変数ビューでは, 現在のスタックフレームから見える仮引数やフィールドの値(値がオブジェクトへの参照である場合はそのクラス名とID)を確認できます.
+ 右上の変数ビューでは, 現在のスタックフレームから見える仮引数やthisの値(値がオブジェクトへの参照である場合はそのクラス名とID)を確認できます.
+ 値がオブジェクトへの参照である場合は, 参照先オブジェクト内部のフィールドの値も開いて確認することができます.
+ ここでは, thisの内部を見てみましょう.
なお, ローカル変数名とその値は, トレースファイルに記録されていないため表示されないことに注意してください.
diff --git a/tools/Reverse/TraceDebugger_Reverse.html b/tools/Reverse/TraceDebugger_Reverse.html
index 147be1e..26e7764 100644
--- a/tools/Reverse/TraceDebugger_Reverse.html
+++ b/tools/Reverse/TraceDebugger_Reverse.html
@@ -35,13 +35,13 @@
- トレースデバッガでは, 実行時のプログラム内部の情報を記録したファイルであるトレースファイルを読み込み, その読み込んだトレースを元にデバッグ実行を行うことができます.
- 逆方向バージョンは, 先ほど操作していただいた順方向のトレースデバッガに, さらに以下の機能を追加したものです.
+ トレースデバッガでは, 実行時のプログラム内部の情報を時系列に記録したファイルであるトレースファイルを読み込み, その読み込んだトレースを元にデバッグ実行を再現することができます.
+ 逆方向バージョンでは, 先ほど操作していただいた順方向トレースデバッガの機能に, さらに以下の機能が追加されています.

- いったんステップオーバーを2回押して, D.java の8行目で実行が一時停止している状態にしてください.
+ 次にステップオーバーを2回押して, D.java の8行目で実行が一時停止している状態にしてください.
このデバッガには, 「ステップイン」を逆向きに行う機能があります.
ブレークポイントビューの「ステップバックイン」アイコンをクリックすると, 実行をステートメント単位で巻き戻し,
呼び出し先のメソッドがある場合はその呼び出し先のメソッドに後ろから入ります.
@@ -95,7 +95,8 @@
このデバッガには, 「ステップリターン」を逆向きに行う機能があります.
- ブレークポイントビューの「ステップバックリターン」アイコンをクリックすると, 呼び出し元からそのメソッドに入る直前まで実行を巻き戻します.
+ ブレークポイントビューの「ステップバックリターン」アイコンをクリックすると,
+ 今いるメソッドを呼び出す直前の時点まで呼び出し元メソッドの実行を巻き戻します.
ここでは, ステップバックリターンによって, この E クラスの setC(C) メソッドが呼び出される直前の時点,
すなわち, 呼び出し元である D クラスの passB(B) メソッドの7行目まで実行を巻き戻します.

いったん, ステップバックインを1回押して, B.java の6行目で実行が一時停止している状態にしてください.
実行時点の登録ビューでは, 任意のタイミングで現在の実行時点を登録することができます.
- ここでは, 現在の実行時点を登録するに, ビュー上にある追加ボタンをクリックしてください.
+ ここでは, 現在の実行時点を登録するために, ビュー上にある追加ボタンをクリックしてください.
登録された実行時点はビュー上に一覧で表示されます.



- いったんステップオーバーを2回押して, D.java の8行目で実行が一時停止している状態にしてください.
+ 次にステップオーバーを2回押して, D.java の8行目で実行が一時停止している状態にしてください.
変数ビューで this などを開き, フィールドを選択した状態で右クリックすると, ポップアップメニューが表示され,
「値の代入時点に飛ぶ」を選択すると, このフィールドで参照されているオブジェクトが実際に代入される直前の時点まで実行を遡ることができます.
ここでは, this を開いたあとにそのフィールド e をさらに開き, 表示されたフィールド c を右クリックして「値の代入時点に飛ぶ」を選択してください.
@@ -136,7 +137,8 @@

- 「オブジェクトの接近過程」ビュー上の「開始時点」をクリックすると, 参照先側のオブジェクトがどのように接近してきたのかの過程について,
+ 抽出された過程は「オブジェクトの接近過程」ビューに表示されます.
+ 「オブジェクトの接近過程」ビュー上の「開始時点」をクリックすると, 2つのオブジェクトがどのように接近してきたのかの過程について,
その開始時点となるメソッド実行に飛ぶことができます.


- 「オブジェクトの接近過程」ビュー上の「参照時点」をクリックすると, 参照元側のオブジェクトが参照先側のオブジェクトを参照するようになる時点に飛ぶことができます.
+ 「オブジェクトの接近過程」ビュー上の「参照時点」をクリックすると, 参照元側のオブジェクトと参照先側のオブジェクトが関連付けられた時点に飛ぶことができます.
