...

ソースコード中の識別子の分析による リファクタリング

by user

on
Category: Documents
6

views

Report

Comments

Transcript

ソースコード中の識別子の分析による リファクタリング
平成 25 年度
学士学位論文
ソースコード中の識別子の分析による
リファクタリング支援法の研究
Support of refactoring via analysis of identifiers in
source codes
1140389
山本 風歌
指導教員
高田 喜朗
2014 年 2 月 28 日
高知工科大学 情報学群
要 旨
ソースコード中の識別子の分析による
リファクタリング支援法の研究
山本 風歌
プログラムの可読性や保守性を高めるために, プログラムの振る舞いを変えずに設計を見
直す技術として, リファクタリングがある. 様々なリファクタリング手法が提案されている
が, 本研究ではオブジェクト指向プログラミング言語における, インタフェースの抽出手法
について着目する. 既存の手法として, 異なるクラスに存在する同名のメソッドを抜き出し,
それらを新たなクラスとして定義する方法がある. しかし, この手法では類似するクラスの
存在が抽出の前提条件であるため, 現時点で類似する部分が存在しないソースコードからイ
ンタフェースの抽出を行うことが難しい.
そこで, ソースコード中に潜在するインタフェースを, 既存ソースコードのクラス名とメ
ソッド名の対応関係をデータマイニングの一手法である相関ルール抽出手法によって学習
したデータと比較することで予測し, その情報を元にリファクタリングが行えるか検討す
る. 具体的には, ある名詞を含む名前で定義されたクラスのメソッドに頻出する動詞を, 名詞
が持つ抽象的な振る舞いとみなし, その対応関係を知識データとして収集する. リファクタ
リング対象のソースコード中に, 知識データに収録された対応関係が存在する場合, インタ
フェースの抽出をプログラム作成者に提案する.
本研究では, 過去に生産されたソースコード中のクラス名とメソッド名から, 頻出する名
詞と動詞の対応関係を抽出する方法について提案した. また, 実験によって実際に対応関係
が得られることを確認した.
キーワード
リファクタリング, データマイニング, インタフェース抽出
–i–
Abstract
Support of refactoring via analysis of identifiers in source
codes
Fuka YAMAMOTO
Refactoring is a technology to review the software design for improving readability
or maintainability of the program. Various refactoring methods have been proposed,
and this paper focuses on the extraction of interface. An existing approach extracts
the same name method in different classes and defines a new class with that method.
However, this approach is not applicable when two classes do not share the same name
method.
This paper concerns a method for predicting a potential interface in source codes
using the correspondence relation between class names and method names. Specifically,
we collect the correspondence relation between nouns in class names and verbs in method
names. If the correspond relationship is present in source code under refactoring, then
the method suggests the extraction of interface.
This paper proposes a method for extracting frequently appearing correspondence
relation between class names and method names in existing source codes. By performing
experiments, it is confirmed that the proposed method can obtain such corresponding
relationship.
key words
refactoring, data mining, interface extraction
– ii –
目次
第1章
はじめに
1
1.1
研究背景 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1.2
研究目的 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.3
対象とする言語 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.4
論文の構成 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
背景技術
4
第2章
2.1
2.2
第3章
リファクタリング
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.1.1
リファクタリングとは . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.1.2
リファクタリングの目的
. . . . . . . . . . . . . . . . . . . . . . .
4
2.1.3
主なリファクタリング手法 . . . . . . . . . . . . . . . . . . . . . .
5
2.1.4
インタフェースの抽出 . . . . . . . . . . . . . . . . . . . . . . . . .
8
データマイニング
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.2.1
データマイニングとは . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.2.2
データマイニングの活用例 . . . . . . . . . . . . . . . . . . . . . .
10
2.2.3
相関ルール . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
11
提案手法
13
3.1
提案手法の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.2
知識データの収集
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.2.1
識別子の分析 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
3.2.2
頻出する対応関係の抽出
. . . . . . . . . . . . . . . . . . . . . . .
14
インタフェース抽出の提案 . . . . . . . . . . . . . . . . . . . . . . . . . .
14
実験
16
3.3
第4章
– iii –
目次
4.1
実験対象 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
4.2
実験結果 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
第5章
考察
19
第6章
おわりに
21
6.1
まとめと今後の課題 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
6.2
利用したソフトウェア . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
6.2.1
ASTParser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
6.2.2
OpenNLP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
6.2.3
R. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
謝辞
23
参考文献
24
– iv –
図目次
2.1
フィールドの抽出例:リファクタリング前 . . . . . . . . . . . . . . . . . .
6
2.2
フィールドの抽出例:リファクタリング後 . . . . . . . . . . . . . . . . . .
6
2.3
メソッド名の変更例:リファクタリング前 . . . . . . . . . . . . . . . . . .
7
2.4
メソッド名の変更例:リファクタリング後 . . . . . . . . . . . . . . . . . .
7
2.5
メソッドの抽出例:リファクタリング前 . . . . . . . . . . . . . . . . . . .
8
2.6
メソッドの抽出例:リファクタリング後 . . . . . . . . . . . . . . . . . . .
9
2.7
インタフェースの抽出例:リファクタリング前 . . . . . . . . . . . . . . . .
10
2.8
インタフェースの抽出例:リファクタリング後 . . . . . . . . . . . . . . . .
11
4.1
n 個の対応関係を持つ名詞の数 . . . . . . . . . . . . . . . . . . . . . . . .
17
4.2
n 個の対応関係を持つ動詞の数 . . . . . . . . . . . . . . . . . . . . . . . .
18
–v–
表目次
4.1
実験対象としたオープンソースソフトウェア . . . . . . . . . . . . . . . . .
16
5.1
抽出した名詞-動詞の対応関係の一部 . . . . . . . . . . . . . . . . . . . . .
19
– vi –
第1章
はじめに
1.1
研究背景
近年, 情報化社会の発達により, ソフトウェアを使用する人や, 使用する場面が増加してい
る. それに伴い, ソフトウェアの大規模化や複雑化が進んでおり, それを保守する作業にか
かるコストも増加しているため, ソフトウェアの効率的な開発手法や運用方法が求められて
いる.
ソフトウェア開発における保守作業の業務として, バグ修正や機能追加などのソースコー
ド理解が必要とされる作業がある. 可読性や保守性に優れたソースコードの理解にかかる時
間はそうでないものと比べて短くなる事が期待できる. よって, ソースコードの可読性や保
守性の高さは, 効率的なソフトウェア開発の保守や運用を行う上で無視できない要素である
といえる.
プログラムの可読性や保守性を高めるために, プログラムの振る舞いを変えずに設計を見
直す技術として, リファクタリングがある. 様々なリファクタリング手法が提案されている
が, 本研究ではオブジェクト指向プログラミング言語における, インタフェースの抽出手法
について着目する.
インタフェースの抽出とは, 異なるクラスに存在する共通の役割を持つメソッドを抜き出
し, 新たなクラスとしてその性質を定義するものである.
既存の手法として, 異なるクラスに存在する同名のメソッドを抜き出し, それらを新たな
クラスとして定義することで, インタフェースの抽出を行うものがある. この手法は, 既に異
なるクラスに同名メソッドが実装されている場合有効である.
–1–
1.2 研究目的
しかし, 同名メソッドが存在しない状況でも, インタフェースの抽出を行いたいことが
ある.
例えば, クラスの性質から同名メソッドの追加が予測される場合, 予めインタフェースを
抽出しておいたほうが良い場合がある. この時, 既存の手法では異なるクラスの同名メソッ
ドの存在が抽出の前提条件であるため, 同名メソッドが未実装のソースコードからインタ
フェースの抽出を行うことができない.
そこで本研究では, 同名のメソッドがない状況でもインタフェースの抽出を行う方法につ
いて検討する.
1.2
研究目的
ソースコード中に潜在的に存在するインタフェースを, 既存ソースコードのクラス名と
メソッド名の対応関係を学習したデータと比較することで予測し, その情報を元にインタ
フェースの抽出を行うことで, プログラムに拡張性をもたせる. 具体的には, ある名詞を含
む名前で定義されたクラスのメソッドに頻出する動詞を, 名詞が指す物や概念が持つ抽象的
な振る舞いとみなし, その対応関係を知識データとして収集する. リファクタリング対象の
ソースコード中に, 知識データに収録された対応関係が存在する場合, インタフェースの抽
出をプログラム作成者に提案する.
本研究では, 提案手法に必要な知識データを, 過去に生産されたソースコード中のクラス
名とメソッド名から, 頻出する名詞と動詞の対応関係を抽出する方法について提案し, 実際
に対応関係が取得できるか実験をおこなう.
1.3
対象とする言語
本研究では, Java プログラミング言語を対象としてリファクタリング支援についての研究
を行う. Java 言語を選択した理由は, Java 言語がオブジェクト指向言語であり, かつ体系化
されているリファクタリング手法の多くがオブジェクト指向に沿ったものであることと, 知
–2–
1.4 論文の構成
名度の高いオープンソース・ソフトウェアが多く存在し, 本研究で行う実験に必要なソース
コードの入手が容易であったことである.
1.4
論文の構成
論文は, 本章を含めて 6 章で構成されている. 第 1 章では, 研究の背景と目的について述
べる. 第 2 章では, 背景技術であるデータマイニングとリファクタリング, さらにリファクタ
リングの一手法であるインタフェース抽出について述べる. 第 3 章では, 提案手法について
述べ, 第 4 章では, 実験内容について述べる. 第 5 章では, 実験結果についての考察を述べる.
最後に, 第 6 章で研究のまとめと今後の課題, 関連研究について述べる.
–3–
第2章
背景技術
2.1
2.1.1
リファクタリング
リファクタリングとは
ソフトウェアの開発では, リファクタリング [1] という作業がよく行われる. リファクタリ
ングとは, ソフトウェアの外観や外的な振る舞いを変えずに, プログラムの設計を見直す技
術である. 仕様変更や機能追加が頻繁に行われるソフトウェア開発の現場において, ソフト
ウェアの品質や資産としての価値を一定に保つために行われる.
リファクタリングという言葉と考え方は, オブジェクト指向のプログラミング言語の先駆
けである Smalltalk のコミュニティで生まれ, 広まったとされている [1]. 現在, 体系化され
ているリファクタリング手法の多くが, オブジェクト指向の性質に沿ったものになっている.
2.1.2
リファクタリングの目的
リファクタリングは, 拡張性や保守性を高めるといった, ソースコードの品質向上を目的
として行われる. リファクタリングを行う動機として, 仕様変更や機能追加に備える目的で,
ソースコードの拡張性や汎用性を向上させたい場合や, バグ修正のためのソースコード理解
を行いたい場合などがある. また, コードレビューによってソースコードを洗練させる目的
のためにソフトウェア開発時に行われることもある. さらに, 内部処理を高速化し, ソフト
ウェアの動作を快適にすることを目的として, 行われる場合もある.
ソースコードの品質を高い状態に保つことで, 保守や運用にかかるコストの削減が期待で
–4–
2.1 リファクタリング
きる. リファクタリングを行うことで, プログラムの可読性を高めることができ, ソフトウェ
アの保守にかかるコストを削減することができる. また, プログラムの拡張性を高めること
ができるため, 将来の仕様変更や機能追加の要求に柔軟に対応することができるようになる.
さらに, モジュールの結合度が低くなるように内部構造を改善することで, プログラムの再
利用性も向上させることができる.
2.1.3
主なリファクタリング手法
現在, 様々なリファクタリング手法が体系化されているが, なかでもよく行われていると
思われるリファクタリング手法として, 次のようなものがある.
• フィールドのカプセル化
• メソッド名の変更
• メソッドの抽出
フィールドのカプセル化は, データの隠匿を目的として行われる. フィールドのカプセル
化によって, 他のオブジェクトからのフィールドのアクセスが明確になり, 意図しないデー
タ書き換えによるバグの発生を抑えることができ, ソースコードの保守性を向上させること
ができる.
例えば, 図 2.1 のプログラムはあるカウンタプログラムの一部である. フィールド count
はカウント数を保持する内部変数であるが, 図 2.1 の状態では, 外部からの書き換えが許可
されているため, increment メソッドを介さずにこの数が書き換わってしまう可能性がある.
そこで, フィールドのカプセル化によるリファクタリングを行い, 2.2 のようにプログラムを
変更する. 内部変数 count への外部からのアクセスを getCount による取得のみに限定す
ることで, 意図しない変数の値の書き換えを防ぐことができると考えられる.
メソッド名の変更は, ソースコード理解にかかる時間的コストを削減することを目的とし
て行われる. メソッドに適切な名前をつけることで, ソースコードの可読性を向上させるこ
とができる.
–5–
2.1 リファクタリング
図 2.1
フィールドの抽出例:リファクタリング前
図 2.2
フィールドの抽出例:リファクタリング後
例えば, 図 2.3 のプログラムは整数型リストに対して操作を行うプログラムの一部である.
メソッド calculate は与えられた整数型リストの中身の合計値を計算するプログラムである
が, calculate という名前から合計値を計算する, というメソッドの役割を知ることは難しい.
そこで, メソッド名の変更によるリファクタリングを行い, 図 2.4 のようにプログラムを変
更する. メソッド名を calculateSum に変更することで, メソッドの役割が変更前と比べて
より分かりやすいものになっており, プログラムの可読性を向上させることができると考え
られる.
メソッドの抽出は, 重複コードの削減を目的として行われる. 処理を共通化することで,
重複していた部分に関して修正が行われたとき, 修正し忘れによるバグ混入を防ぐことが出
来る.
–6–
2.1 リファクタリング
図 2.3
メソッド名の変更例:リファクタリング前
図 2.4
メソッド名の変更例:リファクタリング後
例えば, 図 2.5 のプログラムは整数型のリストの一部である. メソッド add と remove は
それぞれ要素を追加/削除するメソッドであり, 変化後のリストの状態を要素が追加/削除
されるたびに出力する. ここで, 状態の出力形式を変更することを考えると, add, remove そ
れぞれの部分に変更を加えなければならない. そこで, メソッドの抽出によるリファクタリ
ングを行い, 図 2.6 のようにプログラムを変更する. 重複していた出力部のプログラムを取
り出し, メソッド printState として新たに定義することで, 処理の共通化を行っている. こ
のように変更することで, 出力形式の変更があった時に, printState のみ変更を加える事で
出力形式の変更や, 処理方法の変更を行うことができる. よって, 重複していた部分への変更
にかかる, コストの削減や, 変更し忘れによるバグ混入を防ぐ事ができると考えられる.
–7–
2.1 リファクタリング
図 2.5
2.1.4
メソッドの抽出例:リファクタリング前
インタフェースの抽出
インタフェースの抽出とは, 異なるクラスに存在する共通の役割を持つメソッドを抜き出
し, 新たなクラスとしてその性質を定義するリファクタリング手法のことである. 一つのク
ラスが表現する性質を限定することで, プログラムの振る舞いが理解しやすくなる. また, イ
ンタフェース利用側では多態性を利用して条件分岐を単純に表現できるため, 処理の流れが
見通しやすくなる.
例えば, 図 2.7 のプログラムは図形操作に関するプログラムの一部である. クラス
SequenceImage と TriangleImage はそれぞれ四角形の画像と三角形の画像を表すクラスで
–8–
2.1 リファクタリング
図 2.6
メソッドの抽出例:リファクタリング後
あり, draw はそれぞれの図形を描写するメソッドである. また, クラス Canvas は三角形と
四角形の描写先の紙面を表すクラスであり, render は現在紙面に配置されている三角形と四
角形を描き込むメソッドである. ここで, 三角形の画像と四角形の画像に共通して存在する
draw メソッドに注目して, インタフェースの抽出によるリファクタリングを行い, 図 2.8 の
ようにプログラムを変更する. 変更後のプログラムでは, Image を新たにインタフェースと
して定義している. これは, インタフェースの抽出によって共通する取り出し可能な性質を
新たに定義したものであり, それによって render 内の三角形と四角形の draw メソッドに
関する処理は, 変更前と比べて単純に表現できていることがわかる.
–9–
2.2 データマイニング
図 2.7 インタフェースの抽出例:リファクタリング前
2.2
2.2.1
データマイニング
データマイニングとは
データマイニングとは, 大量のデータ集合中から有用な知識やルールを発見する技術であ
る. データマイニングを行うことで, これまで不明瞭だったデータの対応関係や全く新しい
知識を取り出すことが期待できる.
2.2.2
データマイニングの活用例
データマイニングの活用例として, コンビニやスーパーなどの小売店における, 顧客の購
買情報分析が考えられる. 購買情報を分析することによって, よく買われている商品の組み
– 10 –
2.2 データマイニング
図 2.8 インタフェースの抽出例:リファクタリング後
合わせや, 客層などを知ることができる. 得られた知識は, より販売数が伸びるように, 店舗
のレイアウトや商品の仕入れ数を改善するために活用することができる.
2.2.3
相関ルール
データマイニング手法の一つに, 相関ルールがある. 相関ルールとは, データ列集合に頻出
するアイテムの組み合わせを表したものである. データ列中にアイテム A が出現するとき,
アイテム B が一定の確率で出現することを {A} ⇒ {B} で表し, {A} を条件部, {B} を帰
結部と呼ぶ. 例えば, 「おにぎり」と一緒に「のみもの」がよく買われていることを表すよ
うな相関ルールは { おにぎり } ⇒ { のみもの } と表すことができる.
相関ルールの信頼度を表す指標として, 支持度 (Support) と確信度 (Confidence) が用い
– 11 –
2.2 データマイニング
られる. 支持度はデータ列集合中にルールが出現する割合を表し, 確信度はデータ列中に条
件部が出現した時に帰結部が出現する割合を表す.
データ列集合 T r 中のデータ列を tr としたとき, {A} ⇒ {B} の
支持度 S は,
S=
確信度 C は,
C=
count (tr ∋ A)
count(T r)
count (tr ∋ A, B)
count (tr ∋ A)
と表される. ただし count は条件をみたすようなデータ列の数を表す.
相関ルール抽出の先験的なアルゴリズム [2] を始めとする多くの相関ルール抽出手法では,
支持度と確信度が与えられたしきい値以上になるような組み合わせのみを見つけることで,
効率的に相関ルールを抽出する.
– 12 –
第3章
提案手法
3.1
提案手法の概要
提案手法では, まず過去に生産されたソースコードから, 頻出するクラス名とメソッド名
の対応関係を収録した知識データを得る. 知識データとリファクタリング対象のソースコー
ドを比較し, 対応する関係がリファクタリング対象に存在すれば, インタフェースの抽出を
プログラム作成者に提案する.
3.2
知識データの収集
知識データの収集は, ソースコード中に含まれるクラス名とメソッド名を取り出す識別子
の分析を行う「識別子の分析」と, それによって得たデータ列集合から, 頻出する名詞-動詞
の対応関係を調べる「頻出する対応関係の抽出」によって行われる.
3.2.1
識別子の分析
まず, ソースコード中に含まれるクラス名とメソッド名を ASTParser [3] を利用して抽出
する. ソースコードを ASTParser に通すと, 抽象構文木が得られる. この抽象構文木中のク
ラス定義に関するノードからクラス名を, メソッド定義に関するノードからメソッド名を得
る. ここで, 抽出した語が複合語である場合は, 語を構成する単語に分解する. 単語の分解は,
正規表現 (?<=[A-Z])(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])|[0-9_] を区切り文字と
して行う. ここで (?<=regex) は, 正規表現 regex と一致する文字列が前方にあるような文
– 13 –
3.3 インタフェース抽出の提案
字列を表現する記法であり, (?=regex) は, 正規表現 regex と一致する文字列が後方に続く
ような文字列を表現する記法である. すなわち, 正規表現 (?<=[A-Z])(?=[A-Z][a-z]) は
英大文字と英大文字の次に英小文字が続く文字列の間に一致し, (?<=[a-z])(?=[A-Z]) は
英小文字と英大文字の間に一致する. これらを区切りとして用いることで, キャメルケース
やスネークケースで表現された複合語から要素語を取り出す.
次に, クラス名から収集した単語は名詞のみを, メソッド名から収集した単語は動詞のみ
を取り出す. 品詞の判定には, OpenNLP [4] を用いた.
以上の操作によって得られた語群をデータ列とする. この手順を複数のソースコードに対
して適用し, 識別子のデータ列集合を得る.
3.2.2
頻出する対応関係の抽出
識別子の分析によって得たデータ列集合に対して, 頻出する名詞-動詞の対応関係を調べ
る. 頻出する対応関係の抽出には, データマイニング手法の一種である相関ルール抽出を用
いる. 相関ルールの抽出には, R [5] を用いた. データ列集合と確信度, 支持度のしきい値を
入力することで, 入力データ列集合に対する相関ルールを得る. また, 条件部と帰結部が保持
するアイテムのサイズをそれぞれ 1 つ以下に制限し, さらに, 条件部に名詞を, 帰結部に動詞
を含むようなルールのみを取り出す. ここまでで述べた操作を行うことで, 名詞と動詞の対
応関係を得ることができる.
3.3
インタフェース抽出の提案
インタフェース抽出の提案は, 知識データの収集によって得られた対応関係を, リファク
タリング対象のクラス中から見つけることによって行う. リファクタリング対象のクラス名
に含まれる名詞を取り出し, 知識データ中の名詞と比較する. 一致するものがあれば, 名詞と
の対応関係にある複数の動詞とメソッド名中の動詞と比較する. 一致するものがあれば, そ
れらをインタフェースの抽出が可能な性質とみなし, 一致した対応関係の名詞を新たなクラ
– 14 –
3.3 インタフェース抽出の提案
ス名, 動詞をメソッド名として新たなクラスを定義するとを提案することで, インタフェー
ス抽出の提案を行う.
– 15 –
第4章
実験
4.1
実験対象
提案手法で述べた知識データ獲得の方法で, 過去のソースコード中から名詞と動詞の対応
関係が得られるか実験を行う. 実験対象としたソフトウェアを表 4.1 に示す. これら 4 つの
ソフトウェアから得られた約 2 万クラスを対象として, 知識データ獲得の実験を行う. これ
らのソフトウェアを対象とした理由は, Java プログラミング言語によってコーディングされ
ていることと, 知名度が高く, 多くのユーザが利用するようなライブラリのソースコード中
の識別子の名前は, ある程度熟慮されているものになっていると考えたためである.
表 4.1
実験対象としたオープンソースソフトウェア
ソフトウェア名
入手先
Apache OpenOffice
openoffice.apache.org
Apache Commons
commons.apache.org
Google Guava
code.google.com/p/guava-libraries
OpenJDK
openjdk.java.net
データ列集合が大きいため, 支持度・確信度の高い相関ルールが含まれにくいことや, な
るべく多くの対応関係を抽出するため, 相関ルール抽出のパラメータである支持度と確信度
のしきい値は 0.001 とした. また, 次の語 get, set, is, main, test, byte, char, string, int,
float, double, object, exception に関しては, クラスの性質や種類に関係なく頻出している
– 16 –
4.2 実験結果
図 4.1 n 個の対応関係を持つ名詞の数
と考えられるので, 特定の名詞や動詞と結び付きが強い対応関係を発見するために, 本実験
では, これらの語を識別子の分析段階で除外している.
4.2
実験結果
実験の結果, 3664 組の名詞-動詞の対応関係を抽出できた. 取り出した語群について見る
と, 名詞が 694 語, 動詞が 486 語取り出せている. また, 1 語の名詞に対して平均約 5 語の
動詞が対応関係にあることがわかった. さらに, 取り出した名詞の約 75%が 5 以下の対応関
係を持っており, 動詞については約 69%が 5 以下の対応関係を持っていた. 一つの名詞が持
つ対応関係の数を図 4.1, 動詞が持つ対応関係の数を図 4.2 に示す. 図からも, ほとんどの語
が 5 以下の対応関係を持っていることが読み取れる.
取り出した名詞の一部を, 動詞との対応関係が多かったものから 10 語を以下に示す.
listener(88), bean(67), data(62), event(45), handler(43),
manager(42), element(41), source(40), type(35), context(34)
ただし, 括弧内の数字は対応関係にある動詞の数を表す.
また, 動詞についても, 名詞との対応関係が多かったものから 10 語を以下に示す.
– 17 –
4.2 実験結果
図 4.2 n 個の対応関係を持つ動詞の数
add(242), create(181), remove(173), write(81), read(72),
reset(71), put(66), dispose(46), accept(41), changed(41).
ただし, 括弧内の数字は対応関係にある名詞の数を表す.
– 18 –
第5章
考察
抽出した語の対応関係の一部を表 5.1 に示す. 対応関係の一部に注目すると, acceptor-
accept や connector-connect などの動詞を名詞化したものが抽出されていることがわかる
また, file-write や key-pressed などの特定のドメインにおいて関連性が高いと考えられる
ものも抽出できていることがわかる. これらの対応関係をインタフェースとして抽出すべき
性質とみなす. リファクタリング対象のソースコードから対応関係を見つけることで, イン
タフェースの抽出を提案できる.
表 5.1
抽出した名詞-動詞の対応関係の一部
名詞
動詞 1
動詞 2
動詞 3
acceptor
accept
monitoring
implement
connector
attach
connect
listening
file
modified
read
write
key
pressed
released
choose
今回行った実験で得た対応関係の知識データは, インタフェースの抽出に使用することが
できると考えられるが, 実用性があるかどうかの検討については十分行えていない. 実験で
得た知識の実用性は, 次のような方法で評価できると考えている. Java 言語で複数のクラス
を使用するようなプログラムを書いてもらい, その過程で提案手法によるインタフェースの
抽出を行う. ここで, 実際にインタフェースが提案されているか, 提案されたインタフェース
はプログラムを作成する上で有益なものであったかを調査する方法が考えられる. また, 対
– 19 –
応関係に使用していない他のソフトウェアで定義されているインタフェース群に出現する名
詞と動詞の対応関係がどの程度網羅できているかを調べる方法, なども考えられる.
また, 抽出した対応関係を使用してインタフェースの抽出を行う場合, 一つのクラスに対
して, 複数のインタフェースが抽出できる場合があると考えられる. このような場合, 対応関
係の頻出率などに注目して順序付けを行い, 提案するインタフェースに優先度をつけること
で, より有益なインタフェース提案が行えると考えられる.
– 20 –
第6章
おわりに
6.1
まとめと今後の課題
本研究では, インタフェース抽出のための識別子分析法について提案し, 実験を行った. 結
果, 関連性が高いと考えられる名詞-動詞関係を抽出することが出来た. 今後は, 抽出した知
識の有用性と具体的なリファクタリング支援システムについて検討する予定である.
6.2
利用したソフトウェア
本研究を行うにあたって, 次のソフトウェアを利用した.
6.2.1
ASTParser
ASTParser は, Eclipse Foundation が提供している Java Development Tools (JDK) に
含まれている Java ソースコード用の構文解析器である. 構文解析後の情報は, 構文解析に
よって生成される抽象構文木の各ノードを訪問することで取得することができる.
本研究では, Java ソースコードからクラス名とメソッド名を取得するために利用した.
6.2.2
OpenNLP
OpenNLP は, オープンソースで開発されている自然言語解析を行うためのライブラリで
ある. 様々な言語に対応していて, 文法の解析や品詞の判定を行うことができる.
本研究では, クラス名とメソッド名に使用されている単語の品詞情報を取得するために利
– 21 –
6.2 利用したソフトウェア
用した.
6.2.3
R
R 言語は, 統計解析処理を行うためのプログラミング言語, および開発環境のことである.
数値解析やデータマイニングを目的として利用される.
本研究では, 頻出する対応関係を調べるために利用した.
– 22 –
謝辞
本研究を行うにあたり, 指導教員として多くの御指導をいただいた高知工科大学情報学群,
高田喜朗准教授に心より感謝いたします. また, 副査を引き受けていただいた高知工科大学
情報学群, 横山和俊教授と松崎公紀准教授に深く感謝いたします. 最後に, 本研究を進めるに
あたり, 様々なご助言をいただきました高田研究室の皆様, 同期として共に励まし合った 梅
原大豊氏, 山内雅斗氏に感謝いたします.
– 23 –
参考文献
[1] M. ファウラー 著, 児玉, 友野, 平澤, 梅沢 訳, リファクタリング: プログラミングの体
質改善テクニック, Pearson Education Japan, pp.341-343, 2000.
[2] R. Agrawal and R. Srikant, ”Fast Algorithms for Mining Association Rules in Large
Databases”, VLDB’94, Proceedings of 20th International Conference on Very Large
Data Bases, September 12-15, 1994, Santiago de Chile, Chile, Morgan Kaufmann,
pp.487-499, 1994.
[3] ASTParser, Eclipse Java development tools, http://www.eclipse.org/jdt/
[4] OpenNLP, Apache OpenNLP, https://opennlp.apache.org/
[5] R, The R Project for Statistical Computing, http://www.r-project.org/
– 24 –
Fly UP