共通のクラスを継承したクラス群内に存在するコードクローンの分析
2012SE096加藤拓馬 2012SE228下村碧 2011SE205大橋篤貴 指導教員:横森励士1
はじめに
ソフトウェアの大規模化に伴い,ソフトウェア内部を理 解しやすくするために,複雑な情報を整理して,効果的に 情報を与え,ソフトウェアの保守や理解を支援する方法が 求められている.ソフトウェアの類似した機能を実現する ために,Javaでは継承やインターフェースなどの仕組み が提供されているが,その中で共通の部分は記述のコピー ペーストにより実現されることも考えられ,この部分に着 目して支援を行うことが有効であると考えられる.本研究 では,実際のソフトウェアに対して,共通したクラスを継 承するクラス間のコードクローンがどのように出現するか を分析し,コードクローンが出現するクラス群における特 徴を調査する.分析では,共通のクラスを継承したクラス 群や共通のインターフェースを実装したクラス群を抽出 し,その中に実際にどれくらいのコードクローンが存在す るかを調査する.このような分析を通じて,特定のクラス を継承して新たなクラスが作成された場合に,どのような 警告を出すことが有効であるかを評価する.2
背景技術
2.1 コードクローン コードクローン[1]とは,ソースコード中にある類似ま たは一致したコード断片の事を指し,同一または良く似 た処理をコピーペーストで実現した場合に生じることが 多い.似たような機能を実現するために共通した必要な前 処理や後処理を行う際にも生じやすく,開発者の何らかの 意図によって作りこまれることが多い.コードクローンを 修正する時には,類似するコード断片それぞれにおいて修 正が必要な場合も多く,保守においてはコードクローンを 減らす対策をとる必要がある場面も多い.検出手法によっ て,得られるコードクローンには違いがあり,それは次の ように分類される[3]. 1 空白やタブ,括弧の位置などのコーディングスタイル を除いて,完全一致するコードクローン.(タイプ1) 2 変数名や関数名などのユーザ定義名,変数の型などの 一部の予約語のみ異なるコードクローン.(タイプ2) 3 タイプ2における違いに加えて,文の挿入や削除,変 更が行われたコードクローン.(タイプ3) 2.2 コードクローンの種類とリファクタリングパターン リファクタリング[2]とは,ソフトウェアの振舞いが提 供する機能を維持しながら,ソフトウェアの内部構造を改 良していくことである.ソフトウェアの拡張性や読みやす さ,理解しやすさなどを改善し,後の作業活動において活 動しやすい状況を確保するために行われる.肥後らの研究 [3]では,前節で分類したコードクローンの種類毎に適用 可能なリファクタリング手法を表1のように紹介した.タ イプ3のコードクローンへの対処方法として,テンプレー トメソッドの形成などが上げられているが,今回の分析で は,適用が難しい事例が大半であった. 表1 リファクタリングパターンが対象とするコードク ローン 䝍䜲䝥䠍䚷 䝍䜲䝥䠎 䝍䜲䝥䠏 䕿 䕿 䕧 䕿 䕿 䠉 䕿 䕿 䠉 䕿 䕿 䠉 䠉 䕿 䠉 䠉 䠉 䕿 䝯䝋䝑䝗䛾䝟䝷䝯䞊䝍 䝔䞁䝥䝺䞊䝖䝯䝋䝑䝗䛾ᙧᡂ 䝸䝣䜯䜽䝍䝸䞁䜾䝟䝍䞊䞁 ᑐ㇟䝁䞊䝗䜽䝻䞊䞁 䝯䝋䝑䝗䛾ᢳฟ 䠄ぶ䠅䜽䝷䝇䛾ᢳฟ 䝯䝋䝑䝗䛾ᘬ䛝ୖ䛢 䝯䝋䝑䝗䛾⛣ື 2.3 共通のクラスを継承しているクラス群におけるコー ドクローンに関する分析 安藤らはコードクローン関係をもつクラス群が共通して 利用しているクラスに着目し,そのクラスがクラス群中の 各クラスにおいてどのように利用されているかを調査した [4].結果では,43種類のオープンソースソフトウェアか らコードクローンを持つクラス群を抽出し,それらのクラ ス群が共通して利用しているクラスとして620のクラスを 抽出した.その内の339のクラスがクラス群において共通 の方法で利用されており,その中でも144のクラスはその クラスを継承したのちに共通の処理が記述され,同じよう な振る舞いを行うクラス群においてコードクローンを検出 することができ,共通のクラスを継承したクラス群にコー ドクローンが一定以上存在することを示している.3
共通したクラスを継承するクラス間に存在す
るコードクローンの分析
3.1 研究の動機 前述の分析では,共通のクラスを継承したクラス群に コードクローンが一定以上存在すること,似たような機能 をもつクラス群が形成されていることを示している.実際 のソフトウェアにおいてより詳細に分析を行い,プロジェ クトごとの特徴,もしくはコードクローンを多く含むクラ ス群中における特徴を見つけ出すことで,コードクローン を適切に管理するための助言ができると考える. 13.2 目的 共通したクラスを継承したクラス群においてコードク ローンがどのように出現するかをプロジェクト毎に分析を 行い,コードクローンが出現しやすいプロジェクトの特徴 を分析することで,どのような管理が可能かを推測する. 3.3 分析の手順 次の手順で分析を行う. 1. 20のオープンソースプロジェクトそれぞれについて, ソースコードを1バージョン入手する. 2. プロジェクト内のソースコードを分析し,同一のクラ スを継承しているクラス群や,同一インターフェース を実装しているクラス群をすべて求める. 3. 対象となるソフトウェアのソースコードに対して, CCFinder[1]を用いて,コードクローンを抽出する. 4. 3の結果を用いて,それぞれのクラス群の中で,共通 して記述されている部分にコードクローンが存在して いるかを調査する.ただし,テスト用であると思われ るクラスについては,似たような機能を実現するため のテストで似たようなコードが大量に記述されたとし ても保守性に大きな問題は出ないと考えて,除外した. 3.4 項目 上記の手順で入手した,クラス群とクラス群内のコード クローンの情報をもとに,以下の評価基準で評価を行う. 1. [a] 共通のクラスから継承を行っているクラス群の数 各プロジェクト毎に,継承元ごとにクラス群を作成す る.継承元をもたないクラスは考慮しない.この項目 は,それぞれのプロジェクト毎に,共通の親クラスを 持つクラス群がどれだけ生成されているかを示す. 2. [b]共通のインターフェースを実装したクラス群の数 各クラスが実装しているインターフェース毎に分類 し,クラス群をそれぞれ作成する.複数のインター フェースを実装しているクラスは複数のクラス群に属 することがある.この項目は,それぞれのプロジェク ト毎に共通のインターフェースを持つクラス群がどれ だけ生成されているかを示す. 3. [c] 共通の親クラスから継承を行っているクラス群ま たは共通のインターフェースを実装しているクラス群 内で,コードクローンを持つクラス群の数と割合 a,bで示したクラス群の中で,共通の処理が記述さ れることでコードクローンが生じているクラス群を求 め,それらの数と割合を求める.どのような場合に継 承や実装と関連してコードクローンが生じやすいのか などを,プロジェクト毎に評価するために利用する. 4. [d]クラス群の大きさとコードクローンの種類別割合 a,bのクラス群全体と,cのコードクローンを持つク ラス群それぞれについてクラス群の大きさで分布し, クラス群の大きさによりコードクローンの生じやすさ にの違いがあるかを調査する.また,どの種類のコー ドクローンが多いかを調査し,リファクタリング可能 なものがどれだけ多いかを調査する. 5. [e] 共通の親クラスからの継承を行っているクラス群 または共通のインターフェースを実装しているクラス 群内で,コードクローンがそのクラス群内にどれほど 現れているかの割合 cで示したクラス群の中で,そのクラス群内で生じて いるコードクローンがどれほどの数のクラスに及んで いるかを調査し,その割合を侵食率として求める.
4
分析の結果
20のソフトウェアプロジェクトのソースコードに対し て分析を行った.その分析結果を項目ごとに紹介する. 4.1 共通クラスから継承を行っているクラス群の数と共 通インターフェイスを実装したクラス群の数 項目a,項目bについて,20のプロジェクトに対して分 析した結果を示す.表2は共通のクラスから継承を行って いるクラス群の数と,インターフェースを実装しているク ラス群の数を示したもので,プロジェクト毎に継承が何種 類存在するか,複数回現れてクラス群の中に存在する継承 が何種類存在するかを,継承元がプロジェクト内で宣言さ れたものであるか,標準クラスライブラリを継承している かで分けて示している.以下,継承または実装したクラス がプロジェクト内で宣言されているものを内部継承および 内部実装,標準ライブラリを継承または実装しているもの を外部継承および外部実装と呼ぶ.この結果からは,681 種類の継承の内,50%程が複数のクラスによって継承して いることがわかる.一方,428種類のインターフェースの 内,40%程が複数のクラスで実装されていた. 4.2 共通の親クラスからの継承または共通のインター フェースの実装を行っているクラス群内で,コード クローンをその中に持つクラス群の数と割合 項目cについて,表2で抽出したクラス群を調べたとこ ろ,共通のクラスを継承した321のクラスの内,75のクラ ス群の中にコードクローンが存在し,その内35のクラス 群がタイプ1,2のコードクローンを含むクラス群であっ た.図4.2にプロジェクト毎に,コードクローンを持つク ラス群の割合を示している.タイプ1,2のコードクロー ンは全てのコードクローンに対して約半分検出された.共 通のインターフェースを実装した166のクラス群の内,52 のクラス群の中にコードクローンが存在し,その内36の クラス群がタイプ1,2のコードクローンを持つクラス群 であった.図4.2にプロジェクト毎に,コードクローンを 持つクラス群の割合を示している.タイプ1,2のコード クローンは全てのコードクローンに対して約7割検出され た.これらの分析から,コードクローンを持つクラス群の 割合が高い(30%以上)と低いプロジェクトに二分するこ 2表2 共通のクラスから継承を行っているクラス群の数とインターフェースを実装しているクラス群の数 䝥䝻䝆䜵䜽䝖ྡ ⥲ᩘ ෆ㒊⥅ᢎ እ㒊⥅ᢎ ⥲ᩘ ෆ㒊⥅ᢎ እ㒊⥅ᢎ ⥲ᩘ ෆ㒊ᐇ እ㒊ᐇ ⥲ᩘ ෆ㒊ᐇ እ㒊ᐇ 㼎㼍㼞㼎㼑㼏㼡㼑㻙㻝㻚㻡㻙㼎㼑㼠㼍㻝 㻞㻜 㻝㻞 㻤 㻤 㻣 㻝 㻜 㻜 㻜 㻜 㻜 㻜 㻳㼑㼛㻭㻼㻵㻙㻟㼋㻜㼋㻜 㻡㻡 㻠㻣 㻤 㻟㻡 㻟㻝 㻠 㻠 㻝 㻟 㻜 㻜 㻜 㻴㼛㻰㼛㻷㼡 㻝㻡 㻞 㻝㻟 㻣 㻝 㻢 㻝㻠 㻜 㻝㻠 㻣 㻜 㻣 㼚㼑㼡㼞㼛㼜㼔㼋㻞㻚㻝㻚㻜㼋㼎㼑㼠㼍 㻟㻣 㻝㻣 㻞㻜 㻝㻠 㻥 㻡 㻝㻝 㻝 㻝㻜 㻡 㻝 㻠 㻶㻳㻼㻿㼀㼞㼍㼏㼗㻱㼐㼕㼠 㻝㻢 㻣 㻥 㻝㻞 㻢 㻢 㻞㻠 㻣 㻝㻜 㻢 㻞 㻠 㼙㼛㼚㼐㼞㼕㼍㼚㻙㻜㻘㻡 㻝㻡㻞 㻝㻜㻢 㻠㻢 㻢㻣 㻠㻟 㻞㻠 㻝㻝㻡 㻝㻜㻞 㻝㻟 㻝㻤 㻝㻟 㻡 㼤㼎㼞㼘㼍㼜㼕㻙㻡㻚㻜㻙㼟㼛㼞㼏㼑 㻞 㻞 㻜 㻞 㻞 㻜 㻞 㻜 㻞 㻜 㻜 㻜 㼜㼑㼑㼞㼟㻙㻜㻚㻞 㻞㻝 㻝㻣 㻠 㻝㻣 㻝㻟 㻠 㻝㻜 㻢 㻠 㻥 㻢 㻟 㼠㼑㼤㼘㼕㼜㼟㼑 㻡㻥 㻡㻞 㻣 㻟㻥 㻟㻞 㻣 㻡㻠 㻠㻥 㻡 㻝㻤 㻝㻡 㻟 㼖㼜㼔㼛㼚㼑㼘㼕㼠㼑㻙㼟㼞㼏㻙㻝㻚㻜 㻝㻥 㻟 㻝㻢 㻢 㻝 㻡 㻞㻠 㻝㻝 㻝㻟 㻥 㻢 㻟 㼖㼛㻯㼔㼑㼟㼟㻙㻝㻚㻜㻚㻝㻙㼟㼛㼡㼞㼏㼑㼟 㻥 㻟 㻢 㻟 㻝 㻞 㻥 㻜 㻥 㻡 㻜 㻡 㻿㼣㼑㼑㼠㻴㼛㼙㼑㻟㻰㻙㻝㻚㻣㻙㼟㼞㼏 㻣㻣 㻞㻠 㻡㻟 㻝㻣 㻣 㻝㻜 㻟㻡 㻝 㻟㻠 㻝㻠 㻝 㻝㻟 㼍㼠㼍㼚㼋㻜㼋㻜㻟 㻤 㻟 㻡 㻟 㻜 㻟 㻡 㻜 㻡 㻝 㻜 㻝 㼘㼣㼖㼓㼘㻙㼟㼛㼡㼞㼏㼑㻙㻝㻚㻜㻙㼞㼏㻝 㻠㻡 㻟㻟 㻝㻞 㻞㻝 㻝㻣 㻠 㻟㻣 㻞㻟 㻝㻠 㻞㻣 㻡 㻞㻞 㻷㼘㼡㼐㼓㼛㼜㼛㼘㻮㼋㼟㼞㼏 㻥 㻠 㻡 㻡 㻡 㻜 㻞 㻜 㻞 㻞 㻜 㻞 㻶㼟㼛㼗㼛㼋㻝㻚㻡㻣㻙㼟㼞㼏 㻟㻣 㻝㻡 㻞㻞 㻞㻝 㻣 㻝㻠 㻞㻜 㻝 㻝㻥 㻝㻡 㻝 㻝㻠 㼔㼛㼞㼕㼦㼛㼚㻙㻝㻞㻙㻝㻜㻙㻝㻞 㻣 㻟 㻠 㻟 㻝 㻞 㻣 㻜 㻣 㻟 㻜 㻟 㻶㻱㻼㼘㼡㼟 㻡㻞 㻞㻡 㻞㻣 㻞㻢 㻝㻠 㻝㻞 㻞㻥 㻞㻟 㻢 㻝㻟 㻣 㻢 㼖㼍㼢㼍㻳㼑㼛㼙㻙㻜㻚㻣㻚㻜㻙㻿㻾㻯 㻟㻜 㻝 㻞㻥 㻥 㻝 㻤 㻞㻡 㻞㻠 㻝 㻝㻟 㻝㻞 㻝 㻭㼜㼜㻿㼑㼢㼑㼞㻠㻾㻼㻳㻞㻜㻝㻟㻙㻝㻞㻙㻝㻣 㻝㻝 㻠 㻣 㻢 㻡 㻝 㻝 㻝 㻜 㻝 㻝 㻜 ྜィ 㻢㻤㻝 㻟㻤㻜 㻟㻜㻝 㻟㻞㻝 㻞㻜㻟 㻝㻝㻤 㻠㻞㻤 㻞㻡㻜 㻝㻣㻝 㻝㻢㻢 㻣㻜 㻥㻢 ⥅ᢎ䛾ᩘ 䜽䝷䝇⩌䛾ᩘ ᐇ䛾ᩘ 䜽䝷䝇⩌䛾ᩘ とがわかった.特に,タイプ1,2のコードクローンに限 定した場合,0%のプロジェクトとそれ以外にわけること ができる.割合が0%のプロジェクトはコードクローンの 対策が施されたプロジェクトではないかと考える.また, 共通のインターフェースを実装したクラス群中のコードク ローンは,共通のクラスを継承したクラス群よりもタイプ 1,2のコードクローンを含むことが多い. Ϭ ϭϬ ϮϬ ϯϬ ϰϬ ϱϬ ϲϬ ϳϬ ϴϬ ϵϬ ϭϬϬ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ ϴ ϵ ϭϬ ϭϭ ϭϮ ϭϯ ϭϰ ϭϱ ϭϲ ϭϳ ϭϴ ϭϵ ϮϬ 䝍䜲䝥䠍䠈䠎䠈䠏 䝍䜲䝥䠍䠈䠎 図1 共通の親クラスを継承したクラス群におけるコード クローンを持つクラス群の割合 Ϭ ϭϬ ϮϬ ϯϬ ϰϬ ϱϬ ϲϬ ϳϬ ϴϬ ϵϬ ϭ Ϯ ϯ ϰ ϱ ϲ ϳ ϴ ϵ ϭϬ ϭϭ ϭϮ ϭϯ ϭϰ ϭϱ ϭϲ ϭϳ ϭϴ ϭϵ ϮϬ 䝍䜲䝥䠍䠈䠎䠈䠏 䝍䜲䝥䠍䠈䠎 図2 共通のインターフェースを実装したクラス群におけ るコードクローンを持つクラス群の割合 4.3 クラス群の大きさとコードクローンの種類別の割合 20のプロジェクトに対して,項目dについて,クラス 群の大きさがコードクローンの種類に与える影響につい て調査した.共通の親クラスを持つクラス群と,共通のイ ンターフェースを実装したクラス群について,その中に存 在するコードクローンをタイプ別に分類した.分類結果を 表3に示す.この表から, 共通したクラスを継承するクラ ス群と共通のインターフェースを実装するクラス群両方と も,小さめのクラス群に修正しやすいタイプ1,2が多く 存在し,クラス群の規模が大きくなるほど修正しにくいタ イプ3が多く存在することがわかり,クラス群の規模が小 さいうちのリファクタリングが有効であると考える. 表3 クラス群の大きさとコードクローンの種類別の割合 Ꮚ䜽䝷䝇䛾ᩘ 䝍䜲䝥㻝 䝍䜲䝥㻞 䝍䜲䝥㻟 䜽䝷䝇⩌䛾ᩘ Ꮚ䜽䝷䝇䛾ᩘ 䝍䜲䝥㻝 䝍䜲䝥㻞 䝍䜲䝥㻟 䜽䝷䝇⩌䛾ᩘ 㻞 㻤 㻠 㻤 㻝㻠㻥 㻞 㻠 㻠 㻢 㻣㻞 㻟 㻞 㻝㻜 㻡㻠 㻟 㻡 㻡 㻥 㻟㻥 㻠 㻝 㻟 㻣 㻟㻟 㻠 㻞 㻟 㻡 㻞㻟 㻡 㻟 㻟 㻥 㻞㻠 㻡 㻞 㻝 㻞 㻤 㻢 㻝 㻝 㻠 㻝㻣 㻢 㻝 㻝 㻠 㻣 㻝 㻝 㻟 㻝㻝 㻣 㻝 㻞 㻝 㻟 㻤 㻝 㻝 㻞 㻥 㻤 㻝 㻝 㻥 㻝 㻝 㻟 㻡 㻥 㻝 㻝 㻝㻜 㻝 㻝㻜 㻝 㻝 㻝㻝㼪㻝㻡 㻝 㻟 㻥 㻝㻝㼪㻝㻡 㻝 㻟 㻟 㻝㻢㼪㻞㻜 㻝 㻟 㻞 㻠 㻝㻢㼪㻞㻜 㻝 㻝 㻞 㻢 㻞㻝㼪 㻝 㻡 㻞㻝㼪 㻝 㻠 㻟 㻡 ィ 㻝㻥 㻝㻤 㻡㻞 㻟㻞㻝 ィ 㻝㻢 㻞㻠 㻟㻟 㻝㻢㻢 ඹ㏻䛾䜽䝷䝇䜢⥅ᢎ䛧䛯䜽䝷䝇䛾䜽䝷䝇⩌ ඹ㏻䛾䜲䞁䝍䞊䝣䜵䞊䝇䜢ᐇ䛧䛯䜽䝷䝇⩌ 4.4 クラス群におけるコードクローンの浸食率について 項目eについて,20のプロジェクトに存在する共通の親 クラスを持つクラス群の中で,互いにコードクローンを持 つ75のクラス群と,タイプ1,2のコードクローンを有す る35のクラス群において,クラス群の大きさと侵食率で 分類を行った.その結果を表4に示す.この表から,タイ プ1,2の場合は,クラス群の大きさが増加するにつれて 侵食率は減少する傾向があることが分かった.一方でタイ プ3の場合は,クラス群の大きさが20までのクラス群に 対しては侵食率はあまり変わらなかった.ここから,継承 を持つクラス群の場合は,コードクローンのタイプによっ てクラス群内のコードクローンの発生のしやすさに差があ ると考えられる.同様に,共通のインターフェースを実装 3
するクラス群の中で,互いにコードクローンを持つ52の クラス群と,タイプ1,2のコードクローンを有する36の クラス群それぞれにおいて,クラス群の大きさと侵食率で 分類を行った.その結果を表5に示す.この表から,コー ドクローンのタイプにかかわらず,クラス群中のクラス数 が増加するにつれて,侵食率は減少する傾向があることが 分かった.ここから,インターフェースを実装するクラス 群の場合は,コードクローンのタイプによってそのクラス 群内のコードクローンの発生のしやすさにあまり差がない と考えられる. 表4 共通のクラスを継承するクラス群の侵食率 㻞㼪㻡 㻢㼪㻝㻜 㻝㻝㼪㻝㻡 㻝㻢㼪㻞㻜 㻞㻝㼪㻞㻡 㻞㻢㼪 㻞㼪㻡 㻢㼪㻝㻜 㻝㻝㼪㻝㻡 㻝㻢㼪㻞㻜 㻞㻝㼪㻞㻡 㻞㻢㼪 㻜㼪㻝㻜㻑 㻝 㻝㻝㼪㻞㻜㻑 㻝 㻝 㻞㻝㼪㻟㻜㻑 㻠 㻠 㻟㻝㼪㻠㻜㻑 㻤 㻞 㻟 㻞 㣗 㻠㻝㼪㻡㻜㻑 㻟 㻝 㻝 㻞 㻝 ⋡ 㻡㻝㼪㻢㻜㻑 㻝 㻢㻝㼪㻣㻜㻑 㻣 㻠 㻞 㻝 㻟 㻝 㻣㻝㼪㻤㻜㻑 㻡 㻞 㻝 㻤㻝㼪㻥㻜㻑 㻞 㻝 㻥㻝㼪㻝㻜㻜㻑 㻞㻣 㻞 㻝 㻝㻢 䝍䜲䝥㻝㻘䝍䜲䝥㻞㻘䝍䜲䝥㻟 䝍䜲䝥㻝㻘䝍䜲䝥㻞 䜽䝷䝇⩌䛾䛝䛥 表5 インターフェースを実装するクラス群の侵食率 㻞㼪㻡 㻢㼪㻝㻜 㻝㻝㼪㻝㻡 㻝㻢㼪㻞㻜 㻞㻝㼪㻞㻡 㻞㻢㼪 㻞㼪㻡 㻢㼪㻝㻜 㻝㻝㼪㻝㻡 㻝㻢㼪㻞㻜 㻞㻝㼪㻞㻡 㻞㻢㼪 㻜㼪㻝㻜㻑 㻞 㻝 㻞 㻝 㻝㻝㼪㻞㻜㻑 㻝 㻝 㻝 㻝 㻝 㻝 㻝 㻞㻝㼪㻟㻜㻑 㻞 㻞 㻟㻝㼪㻠㻜㻑 㻞 㻞 㣗 㻠㻝㼪㻡㻜㻑 㻡 㻝 㻝 㻝 㻝 㻟 㻝 㻝 㻝 ⋡ 㻡㻝㼪㻢㻜㻑 㻢㻝㼪㻣㻜㻑 㻣 㻡 㻣㻝㼪㻤㻜㻑 㻢 㻝 㻞 㻤㻝㼪㻥㻜㻑 㻝 㻥㻝㼪㻝㻜㻜㻑 㻝㻢 㻝 㻝㻟 䝍䜲䝥㻝㻘䝍䜲䝥㻞㻘䝍䜲䝥㻟 䝍䜲䝥㻝㻘䝍䜲䝥㻞 䜽䝷䝇⩌䛾䛝䛥
5
考察
5.1 共通の親クラスからの継承またはインターフェース の実装を行っているクラス群内で,コードクローン をその中に持つクラス群の数と割合 項目cでは,項目a,bで求めたクラス群の中で,共通 の処理が記述されることでコードクローンが生じているク ラス群の数と割合を求めた.コードクローンを持つ割合が 高いプロジェクトと低いプロジェクトという形で差がはっ きりと分かる内容であった.タイプ3のコードクローンに 対して,テンプレートメソッドの形成によるリファクタリ ングが可能かを調査したが,適用するのが難しいものが大 半であった.この結果からタイプ1,2のコードクローン の割合が低いプロジェクトはよく管理されたプロジェクト で,本研究で想定したような事象を既に考慮して整理が行 われていると考えられる.一方,割合が高いプロジェクト ではその部分まで管理が行き届いていないと考えられる. 5.2 クラス群の大きさとコードクローンの種類別の割合 項目dでは,クラス群の大きさがコードクローンの種類 に与える影響について調査した.この分析から,共通した クラスを継承するクラス群は,比較的小さいクラス群に修 正しやすいタイプ1,2が多く存在し,クラス群の規模が小 さいうちにリファクタリングを行うほうがよいと考える. 5.3 クラス群におけるコードクローンの浸食率 項目eでは,クラス群の大きさと侵食率で分類した.共 通のクラスを継承するクラス群の場合は,タイプ1,2にお いては,侵食率の高いクラス群は,比較的小さいクラス群 に集中していた.ここから,修正のしやすいコードクロー ンはクラス群の規模が小さいうちにリファクタリングを行 う方がよいと考えられる.また,タイプ3に分類される コードクローンは,クラス群の大きさに関係なくコードク ローンの侵食率が高く,解消が難しいことがわかる. 5.4 考察まとめ 共通したクラス群中にコードクローンが少ないプログラ ムについては,その存在しているコードクローンもタイプ 3などの解消が難しいタイプのものが多く,助言を出す場 合の方向性として,コードクローンの解消を促すような役 割での助言は有効ではなく,既に似た事例となるクラスが 存在することを伝えるような役割となると考えられる.一 方で,共通したクラス群中にコードクローンが多く含まれ るプロジェクトでは,コードクローンの解消を目的とした 助言が有効であると考えられ,特に規模の小さいクラス群 に対して,コードクローンが既に存在しているということ を示すことで解消を促すことが有益で,ソフトウェアの品 質向上に貢献できると考えられる.6
まとめ
本研究では,共通したクラスを継承したクラス群内にど のようにコードクローンが出現したかを分析し,出現率が 高いプロジェクトと低いプロジェクトに大きく二分される ことを確認した.出現率が高いプロジェクトに対しては, コードクローン解消の余地が大きく,コードクローン解消 を促すような助言が有効であると考えられる.今後,助言 の方針を決める際にこれらの知見を活用できると考える.参考文献
[1] T.Kamiya,S.Kusumoto,and K.Inoue:“CCFinder:A multi-linguistic token-based code clone detection system for large scale source code”,IEEE Transac-tions on Software Engineering,vol.28,no.7, pp.654-670,2002. [2] マーチン・ファウラー:“リファクタリング”,ピアソ ン・エデュケーション,2006. [3] 肥後芳樹,吉田則裕:“コードクローンを対象としたリ ファクタリング”,コンピュータソフトウェア,vol.28, no.4,pp.43-56,2011. [4] 安藤正憲,堀江大河,井田裕之:“コードクローンを用 いたコンポーネントランク拡張手法の有効性評価—変 化の影響を受けた部品についての分析—”,南山大学情 報理工学部2013年度卒業論文,2014. 4