課題B2 (接近過程抽出)


接近過程抽出

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

「配置された図形がJHotDrawのシステム内部でどのように管理され,図形選択機能の実行によってどのように取り出されて,どのように選択図形として登録されるか?」
を理解することを目指します.

ここで, 「トレースデバッガ(逆方向)」のパースペクティブを開いてください.

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

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

実際に「オブジェクトの接近過程抽出」を実行すると, 下図のような状態になります.

「オブジェクトの接近過程」ビュー上の「開始時点」をクリックしてください.

「オブジェクトの接近過程抽出」ビュー上の「参照先側001」から「参照先側004」までを順番にクリックしてください.

「オブジェクトの接近過程抽出」ビュー上の「参照元側001」から「参照元側013」までを順番にクリックしてください.

「オブジェクトの接近過程」ビュー上の「参照時点」をクリックしてください.

ここまでで, DefaultDrawingView クラスのインスタンス (id = 150367587) のフィールド selectedFigures が参照している LinkedHashSet のインスタンスに
RectangleFigure クラスのインスタンス (id = 1952912699) が接近する過程を見てきました.
抽出した結果を見ると, DefaultDragTracker クラスのインスタンス (id = 758826749) のフィールド anchorFigure に代入されていた
RectangleFigure クラスのインスタンスを取得してきていることがわかりましたが, その RectangleFigure クラスのインスタンスの参照が
anchorFigure フィールドに代入されるまでの経緯については, この抽出範囲だけではわかりません.
そこで, ここからは, DefaultDragTracker クラスのインスタンス (id = 758826749) に RectangleFigure クラスのインスタンス (id = 1952912699) が
接近する過程を抽出して見ていきます.
まずは, 「オブジェクトの接近過程抽出」ビュー上の「参照先側002」をクリックしてください.

先ほどの操作によって, 現在は DefaultDragTracker クラスの mousePressed(MouseEvent) メソッドの109行目にいます.
ここで, 変数ビュー上の this を開き, フィールド anchorFigure を右クリックしてください.
右クリックすると, ポップアップメニューが出てくるので, 「値の代入時点に飛ぶ」をクリックしてください.
すると, 現在の実行時点が DefaultDragTracker クラスの setDraggedFigure(Figure) メソッドの218行目に移ります.

先ほどの操作によって, 現在は DefaultDragTracker クラスの setDraggedFigure(Figure) メソッドの218行目にいます.
ここで, 変数ビュー上の「フィールド代入前」を開いて, 参照先を右クリックしてください.
右クリックすると, ポップアップメニューが出てくるので,「オブジェクトの接近過程抽出」をクリックしてください.

実際に「オブジェクトの接近過程抽出」を実行すると, 下図のような状態になります.

「オブジェクトの接近過程」ビュー上の「開始時点」をクリックしてください.

「オブジェクトの接近過程抽出」ビュー上の「参照先側001」から「参照先側036」までを順番にクリックしてください.

「オブジェクトの接近過程抽出」ビュー上の「参照元側001」から「参照元側004」までを順番にクリックしてください.

「オブジェクトの接近過程」ビュー上の「参照時点」をクリックしてください.

ここまでで, DefaultDragTracker クラスのインスタンス (id = 758826749) に RectangleFigure クラスのインスタンス (id = 1952912699) が接近する過程を見てきました.
抽出した結果 (「参照先側022」と「参照先側023」) を見ると, QuadTree#findContents(Point2D$Double) のローカル変数 result が参照している
HashSet オブジェクトに追加された RectangleFigure クラスのインスタンスを取得してきていることがわかりましたが,
その RectangleFigure クラスのインスタンスが HashSet オブジェクトに追加されるまでの経緯は, この抽出範囲だけではわかりません.
そこで, ここからは, そのローカル変数 result に RectangleFigure クラスのインスタンス (id = 1952912699) が追加されるまでの過程を見ていきます.
まずは, 「オブジェクトの接近過程抽出」ビュー上の「参照先側028」をクリックしてください.

先ほどの操作によって, 現在は QuadTreeDrawing クラスの findFigure(Point2D$Double) メソッドの129行目にいます.
ここで, ステップネクストを1回押して130行目にまで進んでください.

先ほどの操作によって, 現在は QuadTreeDrawing クラスの findFigure(Point2D$Double) メソッドの130行目にいます.
ここで, 変数ビュー上の「呼び出し後」のメソッド名が Iterator.next() であることを確認してください.
それを確認したら, 変数ビュー上の「呼び出し後」を開いて, 戻り値を右クリックしてください.
右クリックすると, ポップアップメニューが出てくるので, 「オブジェクトの追加時点に飛ぶ」をクリックしてください.
すると, 現在の実行時点が QuadTree$QuadNode クラスの findContains(Point2D$Double, HashSet) メソッドの226行目に移ります.

先ほどの操作によって, 現在は QuadTree$QuadNode クラスの findContains(Point2D$Double, HashSet) メソッドの226行目にいます.
ここで, 変数ビュー上の「呼び出し前」のメソッド名が HashSet.add(Object) であることを確認してください.
それを確認したら, 変数ビュー上の「呼び出し前」を開いて, 引数を右クリックしてください.
右クリックすると, ポップアップメニューが出てくるので, 上の方の HashSet のインスタンスと RectangleFigure の
インスタンスを対象とした「オブジェクトの接近過程抽出」をクリックしてください.

実際に「オブジェクトの接近過程抽出」を実行すると, 下図のような状態になります.

「オブジェクトの接近過程」ビュー上の「開始時点」をクリックしてください.

「オブジェクトの接近過程抽出」ビュー上の「参照先側001」から「参照先側013」までを順番にクリックしてください.

「オブジェクトの接近過程抽出」ビュー上の「参照元側001」から「参照元側004」までを順番にクリックしてください.

「オブジェクトの接近過程」ビュー上の「参照時点」をクリックしてください.

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


課題B2の接近過程抽出が終了しましたら, 以下のアンケートにお答えください.

アンケート回答

次へ