ソフトウェアエンジニアリングシンポジウム 2018
IPSJ/SIGSE Software Engineering Symposium (SES2018)

リファクタリングによる自然さの変化に関する調査—自然さによるリファクタリング支援を目指して—有馬 諒1,a)

肥後 芳樹1,b)

楠本 真二1,c)

概要：リファクタリングはソフトウェアの保守性を向上させるための重要な作業であるが，ソースコード中のどの部分にどのようなリファクタリングを適用するかは，開発者の経験や勘によるものが大きく，リファクタリングを行うことを難しくしている．そこで本研究では，近年盛んに研究されているソースコードの自然さをリファクタリング支援に用いることを目指し，実際のオープンソースソフトウェア開発で行われたリファクタリングに対して，その前後での自然さの変化を調査した．その結果，調査対象の 28 個のうち 19 個のリファクタリングでは，自然さが向上していたことを確認した．このことから，自然さはリファクタリングによって変化するソースコードの特性をとらえており，自然さをリファクタリング支援に用いることは有効であると考えられる．

1. はじめにタリングのうち，19 個のリファクタリングによってソースコードの自然さが向上していたことを確認した．このことリファクタリングとはソフトウェアの外部的振る舞いをから，自然さはリファクタリングによって変化するソース保ちながら内部構造を改善する作業であり，ソフトウェアコードの特性をとらえており，自然さをリファクタリングの保守性を向上させるために重要な作業である．しかし，支援に用いることは有効であると考えられる．

ソースコード中のどの部分にどのようなリファクタリングを適用するかは，開発者の経験や勘によるものが大きく，

2. 調査

リファクタリングを行うことを難しくしている．

本研究では，自然さをリファクタリング支援に用いるこ本研究では，ソースコードをその “自然さ” という観点とが有効かを検証するため，オープンソースソフトウェアから評価することによってリファクタリングを支援する手開発において実際に行われたリファクタリングによって自法を検討する．自然さとは，自然言語処理の手法である言然さがどう変化しているかを調査した．

語モデルを用いて求められる指標であり，単語列がその言語の文としてどれだけ自然かを数値で表したものである．

2.1 調査方法

頻繁に出現する単語列ほど高い自然さが割り当てられ，反本研究の調査ではまず，自然さ計測のための言語モデル対にほとんど出現しない単語列の場合低い自然さが割り当を構築した．本研究では，Tu らの研究 [3] によって用いらてられる．ソースコードの自然さに関する研究は近年盛んれたキャッシュ付き n-gram 言語モデルを用いた．モデルに行われており，コード補完 [1] や，バグ検出 [2] などで成推定のためのソースコードコーパスには，Higo らによっ果が報告されている．て作成されたデータセット [4] を用いた．これは Apache

本研究ではソースコードの自然さを用いたリファクタリ

Software Foundation*1 の Java プロジェクトから作成されング支援研究の第一歩として，自然さをリファクタリングたデータセットであり，テストコードや自動生成ファイル支援に用いることが有効かを検証するための調査を行っが取り除かれた 66,724 Java ファイル，11.5 MLOC からた．この調査では実際のオープンソースソフトウェア開発なる．

で行われたリファクタリングに対して，その前後での自然次に，調査対象となるリファクタリングを収集した．調査

さの変化を調査した．その結果，対象の 28 個のリファク対象のオープンソースソフトウェアとして，JUnit4*2 を用

1a)b)c)大阪大学 大学院情報科学研究科
r-arima@ist.osaka-u.ac.jp
higo@ist.osaka-u.ac.jp
kusumoto@ist.osaka-u.ac.jp

c 2018 Information Processing Society of Japan⃝

いた．JUnit4 は GitHub によって管理されており，GitHub*1*2

http://www.apache.org/
https://github.com/junit-team/junit4249

ソフトウェアエンジニアリングシンポジウム 2018
IPSJ/SIGSE Software Engineering Symposium (SES2018)@Override
protected void validateConstructor(List<Throwable> errors) {validateOnlyOneConstructor(errors);
List<FrameworkField> annotatedFieldsByParameter =getTestClass().getAnnotatedFields(Parameter.class);
if (annotatedFieldsByParameter.size() > 0) {validateZeroArgConstructor(errors);}}@Override
protected void validateConstructor(List<Throwable> errors) {validateOnlyOneConstructor(errors);+
if (fieldsAreAnnotated()) {@Override
protected void validateFields(List<Throwable> errors) {super.validateFields(errors);
List<FrameworkField> annotatedFieldsByParameter =getTestClass().getAnnotatedFields(Parameter.class);
if (annotatedFieldsByParameter.size() > 0) {……

@Override
protected void validateFields(List<Throwable> errors) {super.validateFields(errors);+if (fieldsAreAnnotated()) {+List<FrameworkField> annotatedFieldsByParameter =getAnnotatedFieldsByParameter();……

validateZeroArgConstructor(errors);}

自然さ}

高低+ private List getAnnotatedFieldsByParameter() {+return getTestClass().getAnnotatedFields(Parameter.class);+ }++ private boolean fieldsAreAnnotated() {+return !getAnnotatedFieldsByParameter().isEmpty();+ }(b) リファクタリング後(a) リファクタリング前
図 1

コミット#0215c66 における自然さの変化．+で始まる行はリファクタリングによって追加された行を，-で始まる行はリファクタリングによって削除された行を表す．

を用いた開発者相互によるソースコードレビューによってソースコードの品質が担保されている．本研究ではまず，JUnit4 リポジトリからコミットメッセージにリファクタリングに関連があると思われるキーワードを含むコミットを抽出した．本実験ではキーワードとして refactor ，cleanを用いた．次に抽出されたコミットを目視で確認し，変更内容がリファクタリングのみであり，処理の内容を変えないコミットのみを抽出した．こうして抽出した 28 コミッ
トを調査対象として用いた．
最後に，抽出した各リファクタリングに対して自然さの変化を調査した．各リファクタリングにおいて，リファクタリング適用前と適用後の自然さを構築した言語モデルによって計測することで，リファクタリングによって自然さが向上したか，低下したかを調査した．

2.2 調査結果
調査の結果，28 個のリファクタリングのうち 19 個では3. おわりに本研究では，ソースコードの自然さを用いたリファクタリング支援研究の第一歩として，実際に行われたリファクタリングにおいて自然さがどう変化しているかを調査した．その結果，オープンソースプロジェクトに対して行われた 28 個のリファクタリングのうち，19 個のリファクタリングにおいて自然さが向上しており，自然さをリファクタリング支援に用いることは有効であると考えられる．今後はこの結果を踏まえて，自然さを用いたリファクタリング支援手法を開発する予定である．
謝辞 本研究は，科学研究費補助金基盤研究 (B)(課題番号：17H01725) の助成を得て行われた．
参考文献
[1]

自然さが向上していた．この結果から，自然さはリファクタリングによって変化するソースコードの特性をとらえており，自然さをリファクタリング支援に用いることは有効[2]であると考えられる．
自然さが向上した例として，コミット#0215c66 で行わ[3]れたリファクタリングを図 1 に示す．図において赤い行は自然さが低い行を，青い行は自然さが高い行を表す．このコミットでは複数箇所で共通する処理をメソッドとして切り出すリファクタリングが行われている．その結果，自然さの低かった行がメソッド呼び出しに変更されることで自然さが向上し，ソースコード全体の自然さが向上したと考えられる．

c 2018 Information Processing Society of Japan⃝[4]Hindle, A., Barr, E. T., Su, Z., Gabel, M. and Devanbu,
P.: On the Naturalness of Software, Proceedings of the34th International Conference on Software Engineering,pp. 837–847 (2012).
Ray, B., Hellendoorn, V., Godhane, S., Tu, Z., Bacchelli,
A. and Devanbu, P.: On the “Naturalness” of BuggyCode, Proceedings of the 38th International Conferenceon Software Engineering, pp. 428–439 (2016).
Tu, Z., Su, Z. and Devanbu, P.: On the Localness of Software, Proceedings of the 22nd ACM SIGSOFT International Symposium on Foundations of Software Engineering, pp. 269–280 (2014).
Higo, Y. and Kusumoto, S.: How Should We Measure Functional Sameness from Program Source Code?
An Exploratory Study on Java Methods, Proceedingsof the 22nd ACM SIGSOFT International Symposiumon Foundations of Software Engineering, pp. 294–305(2014).

250