• 検索結果がありません。

第 3 章 プログラム変更の特定手法 17

3.3 クラス情報の抽出

本手法ではソースファイルからASTを作成し,作成されたASTからクラス情 報を抽出する.一つのソースファイルから作成されたASTには,そのソースファ イルに記述されているクラスやそのクラスが持つフィールドやメソッドのノード が含まれている.またJavaにおいて,一つのソースファイルに記述できるクラス の数は一つだけではないため,本手法でASTから抽出するクラス情報には複数の クラスについての情報が含まれていることがある.

ここで,ひとつのクラス,フィールド,メソッドについての情報のデータ構造 を表 3.1に示す.表の「データ名」はそれぞれの持つデータの種類を表しており,

3.3. クラス情報の抽出 21

「説明」はそのデータの説明が記載されている.表はクラス,フィールド,メソッ ドについてのデータ構造に分かれており,「クラス」,「フィールド」,「メソッド」の 下にそれぞれ続く行がそれぞれに対応するデータとなっている.

さらに,それぞれのデータを本手法のどの段階で利用するかについて説明する.

クラス情報の比較(3.4.1節,3.4.2節,3.4.3節)において,クラスのname,フィー ルドのname, type,メソッドのname, type, param, bodyそれぞれ利用され る.また,編集操作によるプログラム要素の削除・追加の特定(3.4.4 節)におい て,クラスのname, start, end,フィールドのclassName,name, start, end, メソッドのclassName, name,start,endが利用される.また,プログラム要素 の移動の特定(3.5 節)において,クラスのfileName, name,text,フィールドfileName, className, text,メソッドのfileName, className, textがそ れぞれ利用される.

本手法では列挙体からもクラス情報を抽出し,抽出後はクラスとして扱う.こ のとき,各列挙体に存在する列挙子はフィールドに関する情報として抽出を行い,

そのときのフィールドの型は「EnumConstant」とする.その他のフィールドやメ ソッドに関する情報の抽出についてはクラスにおけるクラス情報の抽出と同様で ある.

また,抽象クラスやインターフェースからもクラス情報を抽出し,抽出後はク ラスとして扱う.このとき,抽象クラスに存在する抽象メソッドやインタフェース に存在するメソッド宣言もメソッドに関する情報として抽出を行う.これらのメ ソッドはメソッド本体を持たないため,本手法ではメソッド本体が空のメソッド として扱い情報を抽出する.

本手法では,抽出するクラスがジェネリックを行っている場合に付く型パラメー タはクラス名に含まない(たとえば,「A<T >」というクラスが定義されていた場 合,抽出されるクラス名は「A」となる).ただし,フィールドやメソッドなどの クラスメンバの型に型パラメータが指定されていた場合は,それらの型名に含め る(たとえば,「List<String>」型のフィールドが定義されていた場合,このフィー ルドの型は「List<String>」として扱われる).

本手法の解析対象であるJavaでは,クラスや列挙体の中に別のクラスや列挙体 を内部クラスとして定義することができる.本手法では,内部クラスがスナップ ショットの中に存在するとき,本手法ではそれらをすべてトップレベルのクラスと して扱う.この場合,クラス情報のデータ構造上では抽出されたクラス間の包含関 係が失われるが,各クラスにはクラス名に完全限定名が格納されるためそれらの クラス間の包含関係を把握するこができる.(たとえば,デフォルトパッケージ内 にクラスAの中に内部クラスXが定義されている場合,クラスAとクラスXの情 報がそれぞれ抽出されるが,クラスAのクラス名は「−.A」,クラスX「−.A.X

表 3.1: クラス・フィールド・メソッドのデータ構造

データ 説明

クラス

fileName このクラスが記述されているソースファイルの名前

name このクラスの属するパッケージを含むの完全限定名(fully-qualified name) text このクラスのソースファイル上のテキスト表現

start このクラスがソースファイル上で何文字目から始まるかを表すオフセット end このクラスがソースファイル上で何文字目に終わるかを表すオフセット fields このクラスが持つフィールドの集合

methods このクラスが持つメソッドの集合 フィールド

fileName このフィールドが記述されているソースファイルの名前 className このフィールドを持つクラスの完全限定名

text このフィールドのソースファイル上のテキスト表現

start このフィールドがソースファイル上で何文字目から始まるかを表すオフセット end このフィールドがソースファイル上で何文字目に終わるかを表すオフセット name このフィールドの名前

type このフィールドの型

メソッド

fileName このメソッドが記述されているソースファイルの名前 className このメソッドを持つクラスの完全限定名

text このメソッドのソースファイル上のテキスト表現

start このメソッドがソースファイル上で何文字目から始まるかを表すオフセット end このメソッドがソースファイル上で何文字目に終わるかを表すオフセット name このメソッドの名前

type このメソッドの型

param このメソッドの引数を表現するフィールドの集合 body このメソッドの本体のASTノード

3.4. クラス情報の比較 23