Ariesの目次

1. Aries解析結果ファイルの取得
2.Aries解析結果ファイルの読み込み
3. Clone Set Analysis
3.1. Metric Graph
3.1.1. Select Kind of Used Variables オプション
3.1.2. Select Kind of Drawing Clone Set オプション
3.1.3. リファクタリングパターン
3.2. Clone Set List
3.3. Metric Information
3.4. Fragment List
3.5. Source Code View
3.6. Variable List
4. Group Analysis
5. リファクタリング対象クラスの設定
6. 文献
7. 各マニュアルへのリンク

Ariesの使い方

1. Aries解析結果ファイルの取得

最初の作業は,対象ファイルの解析を行い,Aries解析結果ファイルを取得することです. その手順をこれから説明します.

まず,以下の画面において,"Aries(for refactoring-oriented code clone)"フレームの中の get refactoring-oritented cloneを見つけ,nextボタンをクリックします.

すると,以下のような画面が表示されます.解析対象ファイルのリストファイルがある場合はLoad Listを選択します. ない場合は,これから解析対象ファイルを選択する必要があるため,Select File or Directoryを選択します. これらのボタンを押すと,ファイル選択ダイアログボックスが表示されるため, ファイルやディレクトリを選択し,「開く」を選択します.

以下のように,解析対象となるファイルリストが表示されたら,Nextボタンをクリックします.

次に,解析オプションを設定します.

ここでは,以下のオプションを設定できます.

Minimum Clone Length
最小クローン長(必須)
Memory Resource Limit
使用可能メモリサイズ(必須)
Analysis Result File...
Aries解析結果ファイル名(出力ファイル名)(必須)
parameterize member names
クラスのフィールドをパラメータ化する
parameterize method names
メソッド名をパラメータ化する
parameterize type keywords
キーワードをパラメータ化する
parameterize literals
リテラルをパラメータ化する
parameterize package name
パッケージ名をパラメータ化する
parameterize the other names
その他のユーザ定義名をパラメータ化する
CCFinder Other Options
CCFinderのその他のオプション
Aries Other Options
Ariesのその他のオプション
特に必要のない場合は,Aries解析結果ファイル名のみを指定し,残りの項目はデフォルトのままで構いません.

オプションを指定し終えたら,Run Aries Analysisボタンをクリックして下さい. すると,しばらくの間解析ログが出力されたあと,Successfully Finishedと表示されます. これで,Aries解析結果ファイルを得ることができたため,次にこのファイルを用いて,コードクローンの検出作業を行います. Successfully Finishedダイアログボックスの了解ボタンをクリックして,最初の画面に戻ってください.

2. Aries解析結果ファイルの読み込み

最初の画面に戻ったら,"Aries(for refactoring-oriented code clone)"フレームの analyze refactoring-oriented code cloneを見つけ,nextボタンをクリックしてください. すると,以下のような設定画面が表示されます.

ここで設定できる項目は,次のとおりです.
Memory Resource Limit
使用可能メモリサイズ(必須)
Analysis Result File...
Aries解析結果ファイル名(入力ファイル名)(必須)
Other Options
その他のオプション(任意)
"Analysis Result File..."に先ほど取得したAries解析結果ファイルのパスを入力し,Start Aries GUIボタンをクリックします. 以下のようなウィンドウが立ち上がればOKです.

3. Clone Set Analysis

Clone Set Analysis ではユーザはクローンセットをメトリクスに基づいて絞り込み・選択を行い,リファクタリング対象となるクローンセットを決定します. Ariesのクローンセットは三つの単位に分かれています.
宣言
Class 宣言,Interface 宣言.
メソッド
メソッド本体,コンストラクタ,スタティックイニシャライザ.
do 文,for 文,if 文,switch 文,synchronized 文,try 文,While文

3.1 Metric Graph

Aries はこれらの単位に基づいた Metric Graph を用いることによりクローンセットの絞り込みを行います. Metric Graphでは,各メトリクスの範囲をマウスを用いることによって簡単に指定することができます(下画面参照). また,指定したメトリクスの範囲に合ったコードクローンのみを,Clone Set Listフレーム(右側)に表示します(下画面参照).

これにより,条件を満たすコードクローンのみを絞り込むことができます. 使用できるメトリクスは,以下のとおりです. メトリクス名の右側の括弧内の単位は,そのメトリクスを用いている単位を表しています.
POP(S)(宣言,メソッド,文)
コードクローンの同値類の数,つまり,互いにコードクローンになっているコード断片の数です.
LEN(S)(宣言,メソッド,文)
同じクローンセットに含まれるコードクローンのトークン数の平均値です.
DFL(S)(宣言,メソッド,文)
含まれるコードクローンをリファクタリングしたときに,削減されるトークン数の予測値です.
NRV(S)(宣言,メソッド,文)
含まれるコードクローン中で,外部で定義された変数の参照が行われている頻度です. 変数の参照が行われた回数をPOPで割っています.小数点以下は切り上げています.
NSV(S)(宣言,メソッド,文)
含まれるコードクローン中で,外部で定義された変数への代入が行われている頻度です. 変数への代入が行われた回数をPOPで割っています. 小数点以下は切り上げています.
DCH(S)(宣言,メソッド,文)
クラス階層構造上,どのくらいコードクローンが分散しているかを表しています. 階層が1つ上がる毎に,1カウントされます. 同値類の中での最大値をDCHとしています.
DOC(S)(メソッド,文)
このメトリクスはそのクローンセットに含まれるコード片がどの程度違うクラスに散らばっているかを表します. 例えば,すべてのコード片が同じクラス内に存在する時は,この値は0となります. また,すべてのコード片が異なるクラスに存在する時は,最大値1となります.
KMC(S)(メソッド,文)
このメトリクスはメソッド(クローンがメソッド単位の場合はそのメソッド,文単位の場合はその文を含むメソッド)の他のメソッドとの結合度を表しています. この結合度は,メソッドの引数の数や共有する変数の数,返り値に基づいて計算されます. 値が大きいほど,そのメソッドは結合度が大きい,つまり他のメソッドと関係が深いということになり,リファクタリングの対象とすることができます[1].
RFC(S)(クラス)
このメトリクスは,そのクローンセットに含まれるクラスのRFC(C)の値の平均値です. RFC(C)についてはこちらを御覧下さい.
TCC(S)(クラス)
このメトリクスは,そのクローンセットに含まれるクラスのTCC(C)の値の平均値です. TCC(C)についてはこちらを御覧下さい.
LCOM(S)(クラス)
このメトリクスは,そのクローンセットに含まれるクラスのLCOM(C)の値の平均値です. LCOM(C)についてはこちらを御覧下さい.
WMC(S)(クラス)
このメトリクスは,そのクローンセットに含まれるクラスのWMC(C)の値の平均値です. WMC(C)についてはこちらを御覧下さい.
SMT(S)(メソッド)
このメトリクスは,そのクローンセットに含まれるメソッド単位のコードクローンの引数,返り値の型がどの程度一致するかを表します. 引数が primitive な型の場合は型が一致するかを調べます. 引数が クラスの場合は同じ型かもしくは共通の親クラスを継承しているかを調べます. 例えば引数を2つ持つメソッドのクローンがあるとします. この場合は,その2つの引数と返り値の型が一致するかを調べます. 全て一致する場合は1,2つ一致する場合は0.67,1つ一致する場合は0.33,全く一致しない場合は0となります.
CYC(S)(文)
このメトリクスは Mccabe のサイクロマチック数[2]と呼ばれているものです. メソッドをグラフで表現した時に現れる閉路の数 + 1 というのが定義です.

3.1.1 Select Kind Of Used Variable オプション

Metric Graph の上部にあるSelect kind of Used Variablesフレームでは,クローン内で用いているクローンの外で定義された変数(以降,外部定義変数)に対するオプションを設定することができます.
これらのオプションは,以下の通りです.
variable "this"
コードクローン中で"this"変数にアクセスしているか
variable "super"
コードクローン中で"super"変数にアクセスしているか
local variables
コードクローン中でローカル変数にアクセスしているか
this class fields
コードクローン中でそのクラスのフィールドにアクセスしているか
super class fields
コードクローン中でそのクラスが継承している親クラスフィールドにアクセスしているか
interface fields
コードクローン中でそのクラスが継承しているインタフェースフィールドにアクセスしているか
outer variables
コードクローン中でそのクラスの外部クラスで定義された変数にアクセスしているか

3.1.2 Select Kind Of Drawing Clone Set オプション

Metric Graph の下部にあるSelect kind of Drawing Clone Set フレームでは,クローンの単位に対するオプションを設定することができます.
これらオプションによって,どの単位のコードクローンに対して絞り込みを行うかを指定できます.

3.1.3 リファクタリングパターン

現在のところ,以下のリファクタリングパターンがコードクローンを取り除くために用いることができます.
個々のリファクタリングパターンについては,Refactoring Home Pageなどを参考にして下さい. これらのパターンを用いた基本的な絞り込みは,Metric Graphでマウスの右クリックのメニューから行うことができます(下図参照). しかしこの絞り込みはあくまで一例に過ぎないことを注意して下さい.

3.2 Clone Set List

右側にあるClone Set Listフレームには,Metric Graph において絞り込まれたコードクローンの一覧が表示されています. それぞれのクローンには,前述の各メトリクスや単位が表示されており,各項目名をクリックするとそのメトリクスに基づき昇順・降順にソートすることもできます. このリストにおいて,クローンセットを選択(マウスでダブルクリック)をすると,そのクローンセットのより詳細な情報を表示した Clone Set Viewer が現れます. Clone Set Viewer は Metrics Information,Fragment List,Source Code View,Variable Listの4つから構成されます.

3.3 Metric Information

ここでは,選択したコードクローンの各メトリクス値を表示しています.

3.4 Fragment List

ここでは,選択したコードクローンに含まれるコード片の一覧が表示されています. 各コード片につき,そのコード片が含まれるファイル名,行数,およびコード片のトークン数を表示しています. ファイル名をクリックすると,そのソースコードが Source Code View に表示されます(下画面).

3.5 Source Code View

Source Code View は,Fragment List で選択されたコード片のソースコードを表示します.コードクローンは強調表示されます.

3.6 Variable List

Variable List は,Fragment List で選択されたコードクローンに含まれる外部定義変数の情報が表示されます.
Name
変数名
Type
変数の型名
Declared Location
変数の種類(this,super,local,this,this_class_field,super_class_field,interface_field,outer の七種類)
Referred
コードクローン内において,その変数が参照された回数
Assigned
コードクローン内において,その変数が代入された回数

4. Group Analysis

現在,この機能はまだ実装されておりません.

5. リファクタリング対象クラスの設定

デフォルトでは Clone Set Analysis や Group Analysis は解析を行った(クローンを検出した)全てのクラスの中に含まれるコードクローンに対して,リファクタリング支援を行います. しかし,リファクタリングしたいクラスや,したくないクラスが予め分かっている時などは,この機能を用いることによって,より効率的にリファクタリング対象を絞り込むことが可能です. 下図は クラス選択のウィンドウです.
左側はパッケージツリーです. 解析対象のソフトウェアの知識があり,予めリファクタリングすべきクラスを把握している場合などは,パッケージツリーから効率的にクラスを選択することができるでしょう. 解析対象のソフトウェアに対して知識がなくて,あまりにも多くのクローンが検出されている場合などは,右側の Class List のメトリクス値を参考に,どのクラスをリファクタリングするかを選ぶことができるでしょう.またこのリストは各メトリクス値に基づいて昇順・降順にソートすることが可能です. 現在,以下のメトリクスが用意されています.
NOC(C)(Number Of Clones)
そのクラスに含まれているコードクローンの数を表しています.
ROC(C)(Ratio Of Clones)
そのクラスのどの程度がクローンになっているかを表します.クローンになっているトークンの数/クラスに含まれるトークンの数 x 100 の値です.
NOM(C)(Number Of Methods)
そのクラスで定義されているメソッドの数を表します.親クラスから継承したメソッドは含みません.
NOA(C)(Number of Atrributes)
そのクラスで定義されているフィールドの数を表します.親クラスから継承したフィールドは含みません.
RFC(C)(Response For a Class)[3]
そのクラスに定義されているメソッドとそのメソッドから呼び出されているメソッドの数の和です.このメトリクス値が大きいほど,そのクラスには多くのメソッドが関係していることになり,複雑であるといえます.
TCC(C)(Tight Class Cohesion)[4]
フィールドを共有しているメソッドのペアの数を,そのクラスに定義されているメソッドのペアの数で割った値.この値が小さいほど,クラスの結合度が小さいことを表している.
LCOM(C)(Lack of Cohesion Of Method)[5]
そのクラスの凝集度の欠落度を表します.凝集度が低いほど値が高くなります(最大値は2).定義は以下の式の通り.

ここで a はそのクラスに定義されているフィールドの数,
m はそのクラスに定義されているメソッドの数,
Aj は j番目のフィールド,
μ(Aj) はフィールドAjを用いているそのクラスに定義されたメソッドの数,を表します.
WMC(C)(Weighted Methods per Class)
そのクラスの複雑度を表します. クラスの複雑度は,そのクラスに定義されているメソッドの複雑度の和として表されています. 個々のメソッドは McCabe の循環的複雑度(cyclomatic complexity)[2]に基づいて計算されています.

6. 文献


  1. Y. Kataoka, T. Imai, H. Andou, T. Fukaya, "A Quantitative Evaluation of Maintainability Enhancement by Refactoring". Proceedings of the International Conference of Software Maintenance 2002 pp.576-585.
  2. McCabe, "Complexity Measure", IEEE Transacions on Software Engineering, Volume 2, No 4, pp 308-320, December 1976.
  3. S.R. Chidamber and C.F. Kemerer, "A Metrics Suite for Object Oriented Design", IEEE Transactions on Software Engineering, Vol.20, No.6, pp.476-493, 1994
  4. J.M. Bieman and B.K. Kang, "Cohesion and reuse in an object-oriented system", Proceedings of the Symposium on Software Reusability (SSR’95), Seattle, WA, pp. 259-262, April 1995.
  5. Henderson-Sellers, B., "Object-oriented metrics : measures of complexity", Prentice-Hall, pp.142-147, 1996.

7. 各マニュアルへのリンク


Geminiのマニュアルへ
Libraのマニュアルへ
ICCAの紹介,インストールへ