社団法人 電子情報通信学会
THE INSTITUTE OF ELECTRONICS,
INFORMATION AND COMMUNICATION ENGINEERS

信学技報
TECHNICAL REPORT OF IEICE.

コードクローンを用いたコード補完手法の提案
石原 知也†

肥後 芳樹†

楠本真二†† 大阪大学大学院情報科学研究科
あらましソースコードの実装を効率化する手段の１つにコード補完がある．コード補完は開発者が途中まで実装したコードの不足部分を補完する機能であり，近年ではソースコードの再利用支援を目的としたコード補完手法も提案されている．しかし，既存のコード補完手法は途中まで実装されたソースコードの後に続く部分のみを補完するにとどまり，開発者が実装途中に書き漏らしたコードを補完することはできない．本研究では，書き漏らしたコードの発生状況を調べ，書き漏らしコードの補完が有効であるかを調査する．また，書き漏らしコードの補完も実現するために，
コードクローンを用いたコード補完手法を提案して調査に用いる．提案する手法は途中まで実装されたソースコードのType-3 コードクローンを見つけることで，そのソースコードの後に続く部分だけでなく書き漏らしたコードを特定し補完することが可能になる．本論文では，被験者実験を行いコードの書き漏らしについて調査を行った．調査の結果，多くの被験者の実装において書き漏らしが発生しており，書き漏らしコードの補完は有益であることが確認された．
キーワード

コードクローン，コード補完，ソースコード再利用

Code Completion with Code Clones
Tomoya ISHIHARA† , Yoshiki HIGO† , and Shinji KUSUMOTO†† Graduate School of Information Science and Technology, Osaka University
Abstract Code completion is one of the techniques that raise eﬃciency of implementation. Code completion
techniques make up for code lacking in half-written code. Recently, some researchers have proposed techniques
using code completion for helping code reuse. However, existing code completion techniques, which complete only
code following the half-written code, cannot complete code in the middle of the half-written code. In this research,
we investigate the situation where developers forget to write some code and examine whether it is useful to complete
the middle code. Also, we propose a new code completion technique with code clone detection techniques in order
to complete the middle code. The proposed technique can complete both the middle code and following code by
detecting Type-3 code clones of the half-written method. In this research, we have conducted an experiment withsubjects to investigate the code that subjects forgot to write. As a result, we have confirmed that most of thesubjects forgot to write some code in their given tasks and that it was useful to complete the middle code.
Key words Code Clone, Code Completion, Source Code Reuse

1. は じ め にコードの実装を効率化させる手段の 1 つにコード補完があ完を頻繁に使用している [3]．IDE が行う補完機能は単純なものであり，多くの研究者はより効率的な補完手法を提案している [4, 5]．

る．コード補完とは，実装途中のコードを入力として与えると，また，近年では，コードの再利用支援のためにコード補完を

これから先に実装されるであろうコードを自動的に補完する機使用するという研究も行われている [6–8]．書きかけのコード

能のことを示す．開発者は必要な機能を途中まで実装しコードに対して既存研究を用いたコード補完を適用すると，書きかけ補完を適用することで，必要な機能の実装を完了させることがのコードに続く文が補完される．しかし，既存のコード補完はでき，開発者の実装コストの削減が期待できる．現在では，いすでに存在する書きかけのコードの途中や前にコードを補完す

くつかの IDE [1, 2] が変数名やメソッド呼び出し名などの字句ることは考慮していない．開発者が途中まで実装したコードにを補完する機能を有しており，開発者は簡単にコード補完を使

実装漏れがあることは十分に考えられることである．そのため，用することができる．実際，多くの開発者が IDE のコード補

既存手法を用いたコード補完は開発者が書き漏らしたコードに—1—ソースコード集合

1 private String getRectCoords(Rectangle2D rectangle){2
int x1=(int)rectangle.getX();3
int y1=(int)rectangle.getY();

4 }(a) 補完の対象となるメソッド
メソッドの解析
1 private String getRectCoords(Rectangle2D rectangle){2
int x1=(int)rectangle.getX();3
int y1=(int)rectangle.getY();
int x2=x1 + (int)rectangle.getWidth();int y2=y1 + (int)rectangle.getHeight();
4 }return x1 + "," + y1+ ","+ x2+ ","+ y2;

データベース構築処理

補完DB
補完処理

(b) 既存手法を適用した際の補完候補
1

throw new IllegalArgumentException("Null 'rectangle' argument.");int x1=(int)rectangle.getX();
int y1=(int)rectangle.getY();
int x2=x1 + (int)rectangle.getWidth();2
3

int y2=y1 + (int)rectangle.getHeight();
return x1 + "," + y1+ ","+ x2+ ","+ y2;

4

補完候補の提示文の挿入

private String getRectCoords(Rectangle2D rectangle){
if(rectangle == null) { }}int method(int i){
int a = 0;
while(a < i){f = a;:

int b = 0;
int method(int i){
int a = 0;
while(a < i){f = a;:

補完前(c) 書き漏らしを考慮した際の補完候補

補完候補の提示

図2

int method(int i){
int a = 0;
int b = 0;
while(a < i){:

補完後提案手法の概要

図 1 既存手法による補完とその問題点の冒頭部を記述して山本らの手法を適用する．この時，山本ら対するコードの再利用の機会を失っている可能性がある．

の手法では入力された冒頭部を字句列に変換し，得られた字句

本論文では，書き漏らしコードの発生状況について調査を行列とマッチする key を検索する．マッチする key があれば，対い，実装の際にどの程度書き漏らしが発生しているかを明らか

応する value を補完する．これによって，開発者はメソッドのにする．開発者が実装の際に書き漏らしを多く発生させている

冒頭のみを記述するだけでその後に続くロジックを実装するこ場合は，その分だけ既存手法を用いたコード補完でコードのとができる．

再利用の機会が失われている．そのため，書き漏らしたコード

2. 2 既存研究の課題点も補完できるような補完手法が必要になる．また，書き漏らし

図 1(a) は実装途中のメソッドである．開発者は引数で与えコードを補完することでコードの再利用が促進されるかも調査られた長方形の左上の座標と右下の座標を取得して，それを定する．本論文では，コードクローンを用いた新しいコード補完められた形式で出力するメソッドを作成している．図 1(a) の手法を提案し，書き漏らしコードを補完する．提案する手法はメソッドは左上の座標の取得まで実装されている．この時，開Type-3 コードクローンを検出し，検出されたコードクローン

発者が図 1(a) のメソッドに対してコード補完機能を適用するから補完候補となる文を特定する．それに伴い，本論文では高と，右下の座標を取得し定められた形式に変換した上で出力す

速な Type-3 コードクローン検出手法を考案して，補完候補のる処理が補完されることが期待される．

特定に用いている．

開発者が図 1(a) のメソッドに対して既存手法を用いたコード

本論文では被験者実験を行い，書き漏らしコードが発生する

補完を適用した場合，図 1(b) のように補完候補が提示される．

状況や補完される状況を調査した．実験では，被験者はいくつ

しかし，図 1(c) のように開発者はメソッドの先頭で引数に対すかのタスクが与えられ，被験者がタスクを実装する様子が録画

るエラーチェックを記述し忘れている可能性があったが，その部された．記録された映像を基に，書き漏らしの発生状況や提案

分は補完候補として提示されていない．既存手法では，途中ま手法の適用結果を著者らが調査した．調査の結果，被験者が実で実装されたコードを冒頭部に持つメソッドを基に，そのコー装したメソッドの 80%で実装途中に書き漏らしが発生していドの後に続く部分を補完候補として提示する．そのため，開発

ることがわかった．また，提案手法は被験者の実装したメソッ

者が途中まで実装したコードの前や間に補完候補が提示される

ドの 63%に対して有益な補完候補を提示しており，そのうちことはない．このように，既存手法では書き漏らしコードを補31%は書き漏らしたコードに対するものであった．

完することは考慮されていない．よって本論文では，既存手法

2. 研究の動機で補完することのできない書き漏らしコードがどの程度発生す
るかについて調査する．また，書き漏らしコードを補完するこ

2. 1 既 存 研 究とができれば，開発者はより信頼性の高いコードを効率的に実山本らは，大量のコードを解析して補完用コーパスを作成し，装できると考えられる．そこで本論文では，書き漏らしコード

そのコーパスの情報を基に適切な補完コードを検索して補完すを補完することで開発者が得られる効果についても調査する．

る手法を提案している [9]．補完用コーパスにはメソッドを字句

以上より，本論文では以下に示す 2 つの問題を調査する．

の列に変換したものが含まれている．この字句列は任意の地点

RQ1： 実装中に書き漏らしはどの程度発生するか．

で 2 つに分割され，分割された字句列のうち先頭のものが key，

RQ2： 書き漏らしコードを補完することでコードの再利用

後方のものが value として保存されている．開発者はメソッド

はどの程度促進されるか．

—2—

1 public void calculate(){2
int z = 0; -- A3
int x = read(); -- B4
int y = read(); -- C5z = y – x; -- D
6
println(z); -- E
7 }(a) 入力メソッド

1 public void calculate(){2
int c = 0; -- A3
int a = read(); -- B4
int b = read(); -- C5
a = 4 * a + 5;
6
c = b – a; -- D7
println(a,b);8
println(c); -- E
9 }1 public void calculate(){2
int c = 0; -- A3
int a = read(); -- B4
int b = read(); -- C5
a = 4 * a + 5;
6
println(a,b);7
println(c); -- E8c = b – a; -- D
9 }1 public void calculate(){2
int c = 0; -- A3
int a = read(); -- B,C4
int b = 4 * a + 5;
5
c = b – a; -- D
6
println(a,b);7
println(c); -- E
8 }1 public void calculate(){2
int c = 0; -- A3
int a = read(); -- B4
int b = read(); -- C5
a = 4 * a + 5;
6
c = a - b; -- D7
println(a,b);8
println(c); -- E
9 }(b) 入 力 メ ソッド の コ ー ド ク (c) 文の順番が異なるメソッド (d) 文の対応関係に重複がある (e) 変数の対応関係が一貫して
ローン

メソッド

いないメソッド

図 3 コードクローンとして検出されるメソッドと除外されるメソッドの例

3. 書き漏らしコードに対するコード補完

ドの解析処理が必ず実行されていなければならない．提案手法
はデータベースの情報を基に補完候補となる文を特定している

3. 1 提案手法の概要

ため，あらかじめメソッドの解析処理を実行してデータベース

本論文では，書き漏らしコードに対する新しいコード補完手を構築する必要がある．メソッドの解析処理は 1 度だけ実行さ法を提案し，調査に用いる．提案する手法はコードクローン検れればよい．一方で，補完候補の提示処理は開発者がコード補出技術を利用する．この手法では，入力として与えられたメソッ

完機能を利用するたびに実行される．同様に，文の補完処理もドの Type-3 コードクローンとなるメソッドを検出し，そのメ提示された補完候補が選択されるたびに実行される．

ソッドを基に補完候補となる文を検出して開発者に提示する．

3. 2 Type-3 コードクローンの検出

提案手法の概要を図 2 に示す．提案手法はデータベースを構提案手法は，開発者が入力したメソッドに対してデータベー

築する処理と補完処理の大きく 2 つの処理に分けることができスから Type-3 コードクローンを検出する．そのため，開発者

る．また，補完処理は補完候補の提示処理と文の挿入処理の 2の実装の速度を落とさないためにも，Type-3 コードクローンつに分けることができる．提案手法は与えられたソースコードの検出は高速である必要がある．しかし，既存の Type-3 コーからメソッドを抽出し，抽出したメソッドを解析して得た情報

ドクローン検出では大量のコードに対するコードクローン検出をデータベースに登録しておく．開発者は補完したいメソッドに時間を要するため，本論文で用いる Type-3 コードクローンに対して提案手法を適用すると，提案手法はデータベースの情検出には適さない．そのため，本論文では新しい高速な Type-3

報を基に補完候補となる文を求め，補完箇所をハイライトする

コードクローン検出法を考案し，提案手法で使用する．

形で補完候補を提示する．開発者は提示された補完候補をみて考案した Type-3 コードクローン検出法は入力としてメソッ

そのコードを補完するかどうかを判断する．補完したい場合はドを受け取り，入力されたメソッドの Type-3 コードクローン

補完候補を選択することで補完が実行される．開発者は必要なとなるメソッドを出力する．ただし，Type-3 コードクローン

数だけ補完候補を選択したら補完を終了させる．

検出法を用いるためにはあらかじめソースコードを解析してメ

図 2 を見てわかるように，提案手法は大きく分けて以下の 3
つの処理に分類できる．

ソッドの情報をデータベースに保存しておく必要がある．デー
タベースには，解析したソースコードに存在するメソッドとそ

メソッドの解析 この処理では，与えられたソースコードをのメソッド中にある文の情報が格納されている．文の情報には解析して補完用のデータベースを作成する．データベースに文のハッシュ値と文中で使用される変数名が含まれる．データ

は，ソースコードから抽出されたメソッドの文の情報が格納さベースに情報が格納されたら，Type-3 コードクローン検出法

れる．ここでいう文の情報には，文中で使われている変数名やを用いてコードクローン検出を行うことができる．

文のハッシュ値が含まれる．文の情報は次の処理である補完候
補の提示の際に使用される．

Type-3 コードクローン検出法は以下の 3 つのステップで構成される．

補完候補の提示 この処理では，入力として与えられたメソッ

STEP1: 入力されたメソッドの各文のハッシュ値を算出し，ドの Type-3 コードクローンとなるメソッドを検出し，補完候

全てのハッシュ値を持つメソッドをデータベースから検索する．

補となる文を特定する．Type-3 コードクローンの検出には後検索されたメソッドが Type-3 コードクローンの候補になる．

述する Type-3 コードクローン検出法を用いる．入力されたメ

また，検索時に入力メソッドと検索されたメソッドに対して文

ソッドと検出された Type-3 コードクローンの差分となる文がの対応関係を構築する．ハッシュ値が等しい文同士が対応関係補完候補となる．特定された補完候補となる文は各補完箇所ごをもつ．

とに開発者に提示される．

STEP2: 検索されたメソッドの対応関係をもつ文と入力メ

文の挿入 この処理では，選択された補完候補となる文を実装

ソッドの対応関係をもつ文の順番が異なる場合は，検索された中のコードに補完する．開発者が複数の補完候補を選択するこメソッドを Type-3 コードクローンの候補から除外する．また，とも考慮して，補完後も補完候補の提示は継続する．開発者が重複して対応関係をもつ文がある場合も検索されたメソッドをコードに対して補完以外の処理を行ったら，補完候補の提示をType-3 コードクローンの候補から除外する．

終了する．
補完候補の提示処理を実行するためには，それ以前にメソッ

STEP3: 対応関係を持つ文から得られる変数の対応関係が一貫しているかを確認する．一貫していない場合はそのメソッ—3—

ドを Type-3 コードクローンの候補から除外する．最後まで候して実装を行う．実装の際は被験者に対する制限はなく，被験補として残ったメソッドが Type-3 コードクローンとして検出

者は普段実装する時と同じ環境で実装できる．例えば，web でされる．

コードを検索してそのコードをコピーして実装することも許可

図 3 はコードクローンとして検出されるメソッドとそうでなされている．あらかじめ各メソッドに対していくつかのテスト

いメソッドの例を示している．図 3 の各メソッドにおいて，文ケースが用意されており，その全てを通過したときにタスクがの後ろにあるアルファベットが等しい文同士が対応関係をもつ．

終了したと判断される．

図 3(a) のメソッドが入力されたとき，図 3(b) はコードクロー

STEP2 では，STEP1 で記録した映像を著者が見て 2 つのンとして検出される．一方で，図 3(c), 3(d), 3(e) のメソッドはRQ を調査する．RQ1 の調査では，被験者がタスクを実装する

コードクローンではない．図 3(a) のメソッドの 5, 6 行目はそ様子を映像を通じて確認し，書き漏らしが発生したメソッドやれぞれ図 3(c) のメソッドの 8, 7 行目に対応する．しかし，そその状況を記録する．書き漏らしコードの発生状況は文単位でれぞれのメソッドで文の順番が異なる．図 3(a) メソッドの 3,調査される．

4 行目はどちらも図 3(e) のメソッドの 3 行目に対応しており，

RQ2 の調査では，被験者がタスクを実装する流れを映像から重複がある．これらのメソッドは STEP2 でコードクローンの取得し，その流れに沿って途中まで実装したコードに対して提候補から除外される．

案手法を適用する．本論文で実装したツールは入力したメソッ

また，図 3(a) のメソッドの 3, 4 行目とそれに対応する図 3(e)ドの構文が正しくなければならないという制限がある．そのたのメソッドの 3, 4 行目から変数 x と a，y と b が対応している

め，実装途中でメソッドの構文が正しくなるたびに提案手法をと判断される．しかし，図 3(a) のメソッドの 5 行目とそれに対適用し，補完候補が提示されるかを確認する．

応する図 3(e) のメソッドの 6 行目から変数 x と b，y と a が対

4. 3 被 験 者

応していると判断される．結果として，対応関係をもつから得

本実験の被験者は著者と同じ専攻に所属する 8 名と研究員 1られる変数の対応関係が一貫していないため，STEP3 でコー名の計 9 名である．すべての被験者は Java の経験が半年以上

ドクローンの候補から除外される．

ある．また，被験者の Java の使用目的として，1 人を除いて全

4. 実

員が授業でのプログラミングと研究での使用を挙げている．

験

4. 4 タ ス ク

本論文では，提案手法を Eclipse Plugin として実装し実験

本実験で被験者に与えられるタスクの数は 6 であり，その全を行った．また，実験の際に提案手法に与えるソースコードとてが与えられた仕様を満たすメソッドを実装するというものでして UCI source code data set(以降 UCI dataset と表記する)ある．被験者には宣言部 (修飾子，返り値，名前，引数，throws

を用いる [10]．UCI dataset は web 上で公開されている Java節) だけが記述されたメソッドが与えられ，コメント部分にはソフトウェアを集めて構成された非常に大規模な Java のソー

そのメソッドの満たすべき仕様が記述されている．被験者はそスファイル集合である．表 1 は UCI dataset の構成を示してのメソッドの本文を実装する．各タスクにはテストケースが用いる．

意されており，全てのテストケースを通過したらタスクが終了

4. 1 定したと判断する．また，最初に全てのテストケースを通過した

義

本論文では，実装途中のコードの後に続くコードを未実装

際の実装をその被験者の最終実装とみなし，それ以後のコード

コード，実装途中のコードの前や間に入るコードを書き漏らしの追加，変更，削除は考慮しない．表 2 は本実験で使用したタ

コードと呼ぶ．また，本実験では，書き漏らしコードをすでに

スクの一覧を示している．

実装されている文の前や間に実装される文と定義する．ただし，未完成の文の前に実装された文は書き漏らしコードではない．

4. 5 RQ1：書き漏らしはどの程度発生するか
RQ1 の調査結果を表 3 に示す．表 3 は被験者が各タスクを

4. 2 実 験 方 法

実装中に書き漏らしコードが発生したかを示している．表中の本論文で行った実験は大きく以下の 2 つの STEP に分けら「◦」はタスクの実装中に 1 度でも書き漏らしコードが発生した

れる．

STEP1: 被験者にいくつかのタスクを与え，そのタスクを被験者が実装する．実装の様子は録画される．

STEP2: 記録した映像を基に著者が 2. 2 で述べた 2 つの RQを調査する．

STEP1 では，被験者は与えられた仕様を満たすメソッドを

表 2 実験で使用したタスク
タスク
タスク 1

13,193

Java ファイル数

2,127,877

メソッド数

20,449,896

取得する．

タスク 3 与えられた長方形の左上と右下の座標を取得する．
タスク 4

プロジェクト数

与えられたパスから拡張子を除いたファイル名をタスク 2 与えられたファイルの中身をバイト配列に読み込む．

実装する．被験者は録画環境が整っているコンピュータに接続
表 1 UCI source code data set の構成

概要

タスク 5
タスク 6

与えられたバイト配列の一部をフィールドにあるバイト配列で置き換える．
与えられた 2 つファイルのうち，片方のファイルの中身をもう片方にコピーする．
与えられた文字列配列を csv 形式で 1 つの文字列に
連結する．

—4—

ことを表し，空白は書き漏らしなく実装が終わったことを表す．

public String task1(String name){if(name == null)
return null;
int idx = name.lastIndexOf(“.”);
if(idx < 0)return name;return name.substring(0,idx);}

また，表中の「-」は録画が失敗したタスクを示す．
表 3 の結果から，録画が成功した全 51 のタスクのうち 41 のpublic String task1(String name){
int idx = name.lastIndexOf(“.”);

タスクで書き漏らしコードが発生したことが判明した．これは全タスクの約 80%に相当する．また，タスクや被験者ごとに多少のばらつきはあるものの，どのタスクや被験者においても 1}(a) 被験者の実装途中のコード(b) テスト通過時のコード

度は書き漏らしコードが発生していることもわかった．このこ

public Stringtask1(Stringname){
if(name== null){}とから，開発者は日常的に書き漏らしコードを発生させている

int idx = name.lastIndexOf(“.”);if(name == null){ }returnreturn “”;“”;
if(idxif(idx ==== -1){-1){ }}

可能性が高いと考えられる．

returnreturn name;name;returnreturn name.substring(0.idx);
name.substring(0.idx);

加えて，書き漏らしコードが発生する原因についても調査を}行った．表 4 は書き漏らしコードの発生原因とそのコードが発(c) ツールによる補完候補となる文の提示

生したタスクの合計数を示している．1 つのタスクに複数の書

図4

き漏らしコードが有りそれらの発生原因が異なる場合は，それ有益な補完の例

ぞれ別々に数えられている．表 4 の結果から，最も多い書き漏
らしコードの発生原因は「引数に対するエラー処理の漏れ」でには異なるが意味的には等しい文のことを示す．被験者が実際あることがわかった．その数は 25 であり，書き漏らしコードに実装した文と意味的に等しい文とは，例えば，ツールの提示が発生した全タスクの約 61%を占める．比較的多い発生原因とした文が if(i - 1 > j) で被験者が実際に実装した文が if(iして「オブジェクトの初期化忘れ」と「処理結果に対する分岐> j + 1) といった場合を示す．表中の「◦」は被験者が実装し忘れ」があることもわかった．また，書き漏らしコードの発生た文と意味的に等しい文が 1 つでも提示されたことを示す．こ

原因として「return 文を先に記述」が挙げられている．これはのうち，書き漏らしコードに対する提示があった場合は「•」で

4. 1 で述べた書き漏らしコードの定義によって引き起こされた

表される．

もので，必ずしも書き漏らしに該当するとは限らない．しかし，

表 5 から，32 のタスクで被験者が実装した文と意味的に等し既存研究を用いたコード補完を適用する場合，return 文を削除

い文が提示されていることがわかる．これは全タスクの 63%をする等の前処理が必要となる可能性がある．

占める．また，書き漏らしコードの補完に絞ると，書き漏らし以上の結果から，RQ1 に対する回答は実装したメソッドの約

コードの存在したタスクの 24%にあたる 10 のタスクで被験者が実装した文と意味的に等しい文が提示されていることがわか80%で書き漏らしが発生するとなる．
4. 6 RQ2：書き漏らしコードを補完することでコードの再る．書き漏らしコードが補完されたタスクは補完が行われたタスクの 31%に相当する．

利用はどの程度促進されるかRQ2 の調査結果を表 5 に示す．表 5 は各タスクごとに被験者

表 5 を見ると，被験者ごとにばらつきはあるがどの被験者のが実装した文と意味的に等しい文が提示されたかを示す．ここ実装に対しても有益な補完候補が提示されている．一方で，タでいう被験者が実装した文と意味的に等しい文とは，被験者がスクに注目して表 5 を見ると，タスク 1 とタスク 6 はすべての実際に実装した文かまたは被験者が実際に実装した文と構造的

被験者の実装に対して有益な補完候補が提示されている．また，書き漏らしコードの補完にのみ着目すると，特定の被験者やタ

表3

スクにおいて有益な補完候補が提示されている．

書き漏らしコードが存在したタスク

タスク 1 タスク 2 タスク 3
被験者 A

-

◦

タスク 4 タスク 5 タスク 6◦

1 回の補完でいくつの文が補完されるかについても調査した．

◦

3

◦

6

書き漏らしコードが補完される場合，その際の文の数は全ての◦4場合で 1 または 2 であった．一方で，未実装コードの場合は 2◦

6文以上補完されることが多かった．また，補完候補が提示され

被験者 B

◦

◦

◦

◦

被験者 C

-

◦

◦

◦

被験者 D

◦

◦

◦

◦

被験者 E

-

◦

◦

◦

◦

4

被験者 F

◦

◦

◦

◦

◦

◦

6

る状況についても調査し，補完適用時に実装されている文が少

被験者 G

◦

◦

◦

◦

◦

◦

6

被験者 H

◦

◦

◦

◦

ないほど補完候補が多く存在することを確認した．

5

8

7

9

◦

4

◦

被験者 I
計

◦

計

4

◦

2

8

41

表 5 各タスクごとの補完結果
タスク 1 タスク 2 タスク 3

表 4 書き漏らしコードの発生原因
発生原因

該当するタスク

タスク 4 タスク 5 タスク 6

-

◦

◦

◦

•

4

被験者 B

•

•

•

◦

•

5

被験者 C

-

◦

•

2

被験者 D

◦

◦

•

4

◦

◦

2

◦

2

◦

6

◦

2

引数に対するエラー処理の漏れ

25

オブジェクトの初期化忘れ

19

被験者 E

-

処理結果に対する分岐忘れ

16

被験者 F

◦

return 文を先に記述

5

被験者 G

•

被験者 H

◦

被験者 I

◦

◦

◦

◦

計

6

4

4

5

close 処理の漏れ

3

その他

12

計

被験者 A

•

◦

◦

◦

◦

4

◦

5

9

32

—5—

図 4 はある被験者が途中まで実装したコードに対して書き

文では，2 つの RQ を調査するために被験者実験を行った．実漏らしコードと未実装コードの両方が補完された例である．図

験の準備として，被験者にタスクを与え，そのタスクを被験者

4(a) のメソッドは被験者がタスクを 1 文だけ実装した時のメが実装する流れが録画された．録画した映像を基に，書き漏ら

ソッドの状態を示しており，テスト通過時には図 4(b) の実装

しコードが発生する状況や補完される状況を調査した．その結に至った．一方で，図 4(a) のメソッドに補完を適用すると，図果，調査対象のメソッドの約 80%で書き漏らしがあり，コード

4(c) のように補完候補となる文が提示される．図 4(b) と 4(c)の書き漏らしは頻繁に発生していることが明らかになった．まを比較すると，図 4(c) の黒背景で表示されている補完候補とた，調査対象のメソッドの約 60%で提案手法は有効な補完候補なる文を被験者は実際に実装していることがわかる．

を提示しており，そのうち約 30%は書き漏らしコードに対する以上の結果から，RQ2 に対する回答は実装したメソッドの約30%で書き漏らしコードに対するコードの再利用が行われると今後の課題として，書き漏らしコードの発生状況について更に詳しく調査を行うことを考えている．本論文で行った実験を

なる．

5. 議

ものであった．

論

5. 1 コードクローンを生成することの是非

より多くの被験者とタスクで行うことによって，開発者やタスクと書き漏らしコードの関係がより明確になると考えられる．
謝辞

本論文は，日本学術振興会科学研究費補助金基盤

提案手法は入力されたメソッドの Type-3 コードクローンと研究 (S)(課題番号：25220003)，挑戦的萌芽研究 (課題番号：なるメソッド (以降，補完候補メソッドと呼ぶ) を基に補完候

24650011)，および文部科学省科学研究費補助金若手研究 (A)(課補となる文を提示している．そのため，補完によって生成され

題番号：24680002) の支援を受けた．

たメソッドは補完候補メソッドのコードクローンになりうる．
コードクローンの存在はソフトウェアの保守性に悪影響を及ぼすといわれており，補完よってコードクローンの悪影響が伝搬する可能性がある．しかし，近年の研究では全てのコードク
ローンがソフトウェアに悪影響を及ぼすわけではないということがわかっている [11, 12]．また，補完候補メソッドとなるのはデータベースに存在するメソッドなので，提案手法に与える
ソースコードを成熟したソフトウェアから構築すればコードク
ローンの悪影響の伝搬を抑えることができる．

5. 2 妥当性への脅威
本論文の結果の妥当性について，以下に挙げる点に留意する必要がある．
被験者 本論文の被験者は全員が著者と同じ専攻に属している．そのため，別の大学の学生や産業界での経験が豊富な開発者に対して同じ実験を行うと結果が変わる可能性がある．
タスク 本論文で用いたタスクはどれも小規模で汎用的な処理を実装するものである．実験結果からもわかるように，補完候補が提示されるかどうかはタスクに依存する可能性が高い．
そのため，今回用いたタスクを変更することで本論文の結果と異なる結果が得られる可能性がある．
データセット 提案手法は入力されたメソッドの Type-3 コー
ドクローンをデータベースから検出することで補完を可能にしている．そのため，補完候補の有無はデータベースを構成する
際に与えるソースコードに依存する．本論文の実験では，Javaのオープンソースソフトウェアで構成されるデータセットを用いているが，与えるソースコードの規模や構成を変えることによって結果が変わる．

6. お わ り に文

献[1] “Eclipse”. http://www.eclipse.org.
[2] “Intellisense”. http://blogs.msdn.com/b/vcblog/archive/
tags/intellisense/.
[3] G.C. Murphy, M. Kersten, and L. Findlater, “How are java
software developers using the eclipse ide?,” IEEE Software,vol.23, no.4, pp.76–83, 2006.
[4] M. Bruch, M. Monperrus, and M. Mezini, “Learning fromexamples to improve code completion systems,” Proc of
The 7th joint meeting of the European Software Engineering Conference and the ACM SIGSOFT Symposium on theFoundations of Software Engineering, pp.213–222, 2009.
[5] C. Omar, Y. Yoon, and T.D.L. adnB. A. Myers, “Activecode completion,” Proc. of the 34th International Conference on Software Engineering, pp.859–869, 2012.
[6] A.T. Nguyen, T.T. Nguyen, H.A. Nguyen, A. Tamrawi,
H.V. Nguyen, J. Al-Kofahi, and T.N. Nguyen, “Graphbased pattern-oriented, context-sensitive source code completion,” Proc. of the 34th International Conference on Software Engineering, pp.69–79, 2012.
[7] R. Hill and J. Rideout, “Automatic method completion,”
Proc. of the 19th International Conference on AutomatedSoftware Engineering, pp.228–235, 2004.
[8] R. Holmes and R.J. Walker, “Systematizing pragmatic software reuse,” ACM Transactions on Software Engineeringand Methodology, vol.21, no.4, pp.1–44, 2012.
[9] T. Yamamoto, N. Yoshida, and Y. Higo, “Seamless code
reuse using source code corpus,” Proc. of the 5th International Workshop on Empirical Software Engineering inPractice, pp.31–36, 2013.
[10] C. Lopes, S. Bajracharya, J. Ossher, and P. Baldi, “Ucisource code data sets”. http://www.ics.uci.edu/~lopes/
datasets/.
[11] K. Hotta, Y. Sasaki, Y. Sano, Y. Higo, and S. Kusumoto,“An empirical study on the impact of duplicate code,” Advances in Software Engineering, vol.2012, no.5, 2012.
[12] N. Göde and R. Koschke, “Frequency and risks of changes
to clones,” Proc. of the 33th International Conference on
Software Engineering, pp.311–320, 2011.

本論文では，開発者が書き漏らしたコードの発生状況や書き漏らしコードを補完することによる開発者への効果を調査した．
また，調査に際して，コードクローンを利用した新しいコード補完手法を提案して書き漏らしコードの補完を実現した．本論—6—