オブジェクトライフサイクルの可視化による オブジェクト指向概念の理解

オブジェクトライフサイクルの可視化による
オブジェクト指向概念の理解支援
Object-oriented Concepts Understanding Support by Visualizing the Object Life Cycle
ソフトウェア工学研究室
p10010
岩本 周也
はじめに
Javaプログラミングの初学者が陥り易い問題として,オ
ブジェクト指向の利点を活かせていないプログラムを作
成する事が挙げられる.これらは,オブジェクト指向概念
の理解が不十分なままプログラムを書く事や,最終的な出
力結果のみでプログラムの良し悪しを判断する事が原因
だと思われる.具体的な問題例としては以下のような事例
がある.
(1) 複数のクラスに分割すべき情報を同じクラス内にま
とめている等,クラス責務が明確になっていない.
(2) 生成したインスタンス内のフィールドを,他のクラス
が頻繁に参照・更新をしている.
初学者にとって,上記の問題があるプログラムであって
もエラー無く動作するため,問題点とは気付きにくい.そ
こで本研究では,オブジェクトライフサイクルを可視化し
問題点に気付き易くさせ,初学者自身にプログラム内の問
題点を改善させる事で,カプセル化や再利用性といった基
本的なオブジェクト指向概念の理解支援を目指す.本研究
においてのオブジェクト指向概念の理解とは,適切なイン
スタンス生成を用いており,クラスを再利用し易く変更・
修正の行い易いプログラムを書ける事,オブジェクト指向
の特徴であるカプセル化を理解している事とする.
2.
先行研究の課題
先行研究に,本学科卒業生の研究がある[2].先行研究に
おいても Java プログラムからオブジェクト(インスタン
ス図)を可視化しており,検査したいプログラムと見本と
なるコードのオブジェクト比較を行い,相違を発見させる
事で Java プログラミングの理解支援を図っている.可視
化図の表示方法では,インスタンスの活性状態を色の明暗
で識別可能にしており,無駄なインスタンスを一目で確認
し易いようになっている.しかし,直接参照更新の指摘と
いったカプセル化を考慮した表示を行っていない事や,ク
ラス情報について表示がされておらずメソッドの遷移が
分かりにくい等,表示方法に改良の余地があった.
3.
オブジェクトライフサイクルの可視化
オブジェクトライフサイクルとは,オブジェクト(イン
スタンス)が生成されてから消滅するまでの流れ全体の事
を指す.本研究では,プログラム内のクラスや生成された
インスタンスに着目し,生成から終了時までの各オブジェ
クト状態を可視化させる.したがって,分岐や繰り返しと
いったプログラムの動作についての可視化は行わない.
以下に,情報表示を行う事でオブジェクト指向概念の理
解に繋がると思われるオブジェクトライフサイクルの局
面を示す.
① インスタンスの生成時
インスタンスが生成されたタイミングで,インスタン
ス図に生成されたインスタンスを出現させる.これによ
り,ソースコードのどこでインスタンス生成が行われて
いるのか,インスタンスの初期状態がどうなっているか
を視覚的に判断できる.この段階では,インスタンスの
1.
指導教員
松浦 佐江子 教授
活性状態は不活性であるため,先行研究と同様インスタ
ンス図を暗く表示する.インスタンスの活性状態とは,
そのインスタンスがアクセスされた事を示す状態であ
る.未アクセスであれば未活性,アクセス済であれば活
性とする.
② メソッドの実行時,フィールドの参照・更新時
この局面では,メソッド実行中のインスタンスをハイ
ライトさせ,変化の生じたインスタンス図を更新させる
事で,各メソッドでどのような作業を行っているのか,
どのフィールドにどのようなアクセスをどこで行って
いるかを示す.メソッド実行されたインスタンスは,活
性化された事を示すため色を明るくする.また,先行研
究の課題を踏まえ1節(2)のように他クラスのフィールド
への直接参照・更新を行っている場合は,互いのインス
タンス図同士を直線で繋ぎカプセル化に反している指
摘を行う事で,プログラム内にある問題点の発見に繋げ
る.直線は赤色で,回数が増えるたびに太く表示する.
ここでは,カプセル化に違反していることを重点的に分
からせるため,表示に参照・更新の区別は出さない.
③ インスタンスの最終状態(プログラム終了時)
この局面では全インスタンスの最終状態が表示され
ているため,最終的に幾つのインスタンスが生成された
か,フィールドの値がどうなっているか等が分かる.ま
た,インスタンスの最終的な活性化状況が分かるため,
無駄なインスタンス生成の有無が確認できる.加えて,
解答となるプログラムと最終状態を比較する事でプロ
グラムのクラス構造を確認させ,1節(1)で挙げた問題に
気付かせる.
4.
ツールの概要
図 1. 可視化ツール
適用したJavaプログラムから3節の可視化を実現するツ
ールを作成した.画面左側にソースコード画面,画面右側
に可視化図表示画面を配置し,そこに実行中の行に対応す
るオブジェクト状態を表示させる.操作機能としてはプロ
グラムを1命令ずつ実行させるステップ機能,1命令前の状
態に戻すバックステップ機能を導入している.各機能でス
テップ数を変化させると,ソースコード画面は実行行をハ
イライトさせ,可視化図は実行行に対応する図へと変化・
更新させる.
ツールの実装において,JavaのデバッガであるJDB[1]を
使用している.JDBとはコマンドを入力する事で1命令単
位の実行や各インスタンス情報の取得が可能なツールで
ある.本ツールにおいては,1行ずつプログラムの実行を
行う「step」機能と,オブジェクトの情報を取得する機能
として「watch」
「print」
「locals」
「dump」等のコマンドを用
いている. watchはフィールドの参照・更新を監視する.
printは入力した式に相当する値を出力する.この機能でオ
ブジェクトのハッシュを出力させ,各インスタンスの判別
に使用する.localsは実行中のメソッドにあるメソッド変
数・ローカル変数を出力する.dumpはインスタンスのフィ
ールド情報を出力する.
データ取得の流れとしては,watch機能で全フィールド
の参照・更新を通知するよう設定した後,step機能で実行
しながらdump機能とlocals機能を使い各変数・フィールド
の値を出力する.その出力内に他インスタンスが含まれる
場合は,print機能を用いてどのインスタンスなのかを判定
する.以上の動作を対象プログラムに1ステップ毎作用さ
せる事で,その行でのインスタンスの変化をデータとして
取得している.この出力されたデータを解析・加工・保持
する事でツールでの可視化機能を実現している.
5.
具体例での考察
以下,具体事例を交えて,本ツールを使用したプログラ
ムの問題発見・改善方法について説明する.具体例として,
オブジェクト指向プログラミングⅠでの課題であった
「LineSegment(線)クラスを実装し,そのLineSegmentクラ
スのインスタンスを複数生成し画面出力を行う」といった
プログラムを使用する.この課題は,以前に作成済みの
Pointクラスを使用して実装する事を目的としている.ク
ラス内の構成は,Pointクラス内にはx,y座標を表すような
整数型フィールドが2つ宣言されているため,LineSegment
クラス内には始点・終点を表すようなPoint型フィールド
が2つ宣言される事が望ましい.また履修者はこの課題が
課された時点で,以前作成したクラスを使って新たなクラ
スを定義したことが無く,アクセス制御についても取り組
んでいないため,カプセル化についての知識が不十分であ
る事を前提とする.
[事例 1] 多く見受けられた問題として, Pointクラスを
使用せずにプログラムを実装している問題がある.以下に
該当者と解答例のインスタンス図を示す.
Point型インスタンスを使って実装している事が分かる.
以上より,初学者は解答例の表示結果から以前作成した
Pointクラスを使用してLineSegmentクラスを実装できる事
を確認した後,自身のプログラムをPointクラスを使用し
たものへと改善を行う.それにより,オブジェクト指向の
特長である再利用性についての理解へと繋げる.
[事例 2] もう1つ多く見受けられた問題点が,他クラス
のフィールドを直接参照・更新している点である.例えば,
LineSegmentクラスのインスタンスを生成する際には,同
時にPointクラスのインスタンスを生成する事になる.本
来その時は,生成したい座標をPointクラスに渡し,Pointク
ラス内でフィールド更新を行う事が望ましいところを,一
度Pointクラスのインスタンスを生成した後,そのインス
タンス内のフィールドをLineSegmentクラス内で直接更新
しているような場合である.直接参照・更新を行うとオブ
ジェクト間の結合度が増し,修正・変更が生じた際にプロ
グラム全体の変更箇所が増える可能性がある.そのため,
アクセス制御を用いて抑制し,できるだけそのデータに関
わる作業をそのクラスに記述すべきとされている.この問
題の場合,インスタンス図に赤い直線が見える事で発見す
る事ができる.以下に,直接参照更新を行っているプログ
ラムのインスタンス図を図 4に示す.
図 4. 改善前のインスタンス図
発見後,ステップ・バックステップ機能を使って,どの行
で直接参照更新が行われているのかを調べ原因箇所の修
正を行う.以上の改善を赤い直線が表示されなくなるまで
繰り返す事で,オブジェクト指向の特徴であるカプセル化
を考慮したプログラムの書き方を理解できる事が望まれ
る.
図 5. 改善後のインスタンス図
図 2. 該当者のインスタンス図
図 3. 解答例のインスタンス図
この問題は,プログラムとクラス数やフィールドの構成等,
解答例となるクラス図やインスタンス図との差異を確認
する事で発見できる.この事例では図 2及び図 3のインス
タンス図より,該当者は4つの数値型フィールドを
LineSegmentクラスに持たせて実装し,解答例では2つの
まとめ
本研究では,クラス・インスタンス情報に加え,他クラ
スのフィールドへの直接参照更新や不要なインスタンス
の有無などのプログラム内の問題点を可視化するツール
を作成し,プログラムからその問題点を発見できる事が確
認できた.今後は,より理解し易いクラス図・インスタン
ス図の表示方法(表示項目,並べ方)や,プログラム内の配
列への対応などの実装を改善し,ツールの有用性を評価す
る事で有用なツールを目指す.
参考文献
[1] JDB,http://docs.oracle.com/javase/jp/7/technotes/tools/wi
ndows/jdb.html
[2] 阿部,可視化されたオブジェクト比較によるJavaプロ
グラミング理解支援,2011年度学位研究論文集
6.