リファクタリング支援のための コードクローンに含まれる識別子の変更内容分析 井上研究室 工藤 良介 1.

Slides:



Advertisements
Similar presentations
SPSSによるHosmer-Lemeshow検定について
Advertisements

東京工科大学 コンピュータサイエンス 亀田弘之
7.n次の行列式   一般的な(n次の)行列式の定義には、数学的な概念がいろいろ必要である。まずそれらを順に見ていく。
9.線形写像.
概要 2009 年 10 月 23 日に、いて座に出現した X 線新星 (XTE J ) を、出現から消滅まで 全天 X 線監視装置 MAXI (マキシ)で観測したところ、 新種のブラックホール新星であることが判明した。 従来のブラックホールを、 多量のガスを一気に飲み込む「肉食系」と.
時間的に変化する信号. 普通の正弦波 は豊富な情報を含んでいません これだけではラジオのような複雑な情報 を送れない 振幅 a あるいは角速度 ω を時間的に変化 させて情報を送る.
情報処理A 第10回 Excelの使い方 その3.
九州大学 岡村研究室 久保 貴哉 1. 利用中のAPの数の推移 2 横軸:時刻 縦軸:接続要求数 ・深夜では一分間で平均一台、 昼間では平均14台程度の接続 要求をAPが受けている。 ・急にAPの利用者数が増えてく るのは7~8時あたり.
麻雀ゲーム 和島研究室 ソ 小林巧人
5.連立一次方程式.
相関.
―本日の講義― ・平均と分散 -代表値 -ぱらつき(分散・標準偏差等) ・Excelによる演習
論理回路 第2回 今日の内容 前回の課題の説明 数の体系 – 数の表現 – 代表的な数 – 基数の変換 – 補数.
ノイズ. 雑音とも呼ばれる。(音でなくても、雑 音という) 入力データに含まれる、本来ほしくない 成分.
広告付き価格サービ ス 小園一正. はじめに 世の中には様々な表現方法の広告があり ます。その中でも私たち学生にとって身 近にあるものを広告媒体として取り入れ られている。 価格サービス(無料配布のルーズリー フ)を体験したことにより興味を惹かれ るきっかけとなった。主な目的は、これ.
素数判定法 2011/6/20.
フーリエ係数の性質. どこまで足す? 理想的には無限大であるが、実際に はそれは出来ない これをフーリエ解析してみる.
1章 行列と行列式.
本宮市立白岩小学校. 1 はじめに 2 家庭学習プログラム開発の視点 ① 先行学習(予習)を生かした 確かな学力を形成する授業づく り ② 家庭との連携を図った家庭学習の習慣化.
プログラミングⅠ( 1 組) 第 9 回
フーリエ級数. 一般的な波はこのように表せる a,b をフーリエ級数とい う 比率:
プログラミング入門2 第4回 式文 代入式 論理演算子 ループの脱出、スキップ 情報工学科 篠埜 功.
3.エントロピーの性質と各種情報量.
9.通信路符号化手法1 (誤り検出と誤り訂正の原理)
Excelによる積分.
1 6.低次の行列式とその応用. 2 行列式とは 行列式とは、正方行列の特徴を表す一つのスカ ラーである。すなわち、行列式は正方行列からスカ ラーに写す写像の一種とみなすこともできる。 正方行列 スカラー(実数) の行列に対する行列式を、 次の行列式という。 行列 の行列式を とも表す。 行列式と行列の記号.
計算のスピードアップ コンピュータでも、sin、cosの計算は大変です 足し算、引き算、掛け算、割り算は早いです
線形符号(10章).
1 0章 数学基礎. 2 ( 定義)集合 集合については、 3セメスタ開講の「離散数学」で詳しく扱う。 集合 大学では、高校より厳密に議論を行う。そのために、議論の 対象を明確にする必要がある。 ある “ もの ” (基本的な対象、概念)の集まりを、 集合という。 集合に含まれる “ もの ” を、集合の要素または元という。
複素数.
4.プッシュダウンオートマトンと 文脈自由文法の等価性
1 0章 数学基礎. 2 ( 定義)集合 集合については、 3セメスタ開講の「離散数学」で詳しく扱う。 集合 大学では、高校より厳密に議論を行う。そのために、議論の 対象を明確にする必要がある。 ある “ もの ” (基本的な対象、概念)の集まりを、 集合という。 集合に含まれる “ もの ” を、集合の要素または元という。
信号測定. 正弦波 多くの場合正弦波は 0V の上下で振動する しかし、これでは AD 変換器に入れら れないので、オフ セットを調整して データを取った.
1 9.線形写像. 2 ここでは、行列の積によって、写像を 定義できることをみていく。 また、行列の積によって定義される写 像の性質を調べていく。
通信路(7章).
3.プッシュダウンオートマトンと 文脈自由文法
6.符号化法(6章).
ビット. 十進数と二進数 十進数  0から9までの数字を使って 0、1、2、3、4、5、6、7、8、9、 10、11、12 と数える 二進数  0と1を使って 0、1、10、11、100、101、11 0、111 と数える.
アルゴリズムとデータ構造 補足資料14-1 「ハッシュ法」
結城諒 司 吉田成 樹 完成予定図 O N! 7セグLE D ランダム表 示 OF F ? 数字が出たら 勝ち!!
平成22年度予算の国立大学法人関連要望事項に係るパブリックコメント説明会
3.正方行列(単位行列、逆行列、対称行列、交代行列)
様々な情報源(4章).
プログラミング演習B ML編 第3回 2010/6/15 (コミ) 2010/6/16 (情報・知能) 住井 ~sumii/class/proenb2010/ml3/
論理回路 第1回. 今日の内容 論理回路とは? 本講義の位置づけ,達成目標 講義スケジュールと内容 受講時の注意事項 成績の評価方法.
Bar-TOP における光の 群速度伝播の解析 名古屋大学 高エネルギー物理研究室 松石 武 (Matsuishi Takeru)
伝わるスライド 中野研究室 M2 石川 雅 信. どのようなスライドを作れば良 いか 伝えたいこと.
C言語応用 構造体.
実装の流れと 今後のスケジュール 03k0014 岸原 大祐. システム概要 天気データをもとに、前向き推論をし ていき、親の代わりに子供に服装、持 ち物、気をつけることなどを教える。
DirectX を使った操作が簡単な2 D 格闘ゲームの制 作 ソ20003 蛯名敏規
階層分析法. 表3. 1 ルートR1R1 R2R2 R3R3 R4R4 R5R5 F1F1 最寄駅までの所要 時間(分) 10 7 F2F2 実乗車時間(分) F3F3 片道切符(円) ヶ月定期(円) 11,21011,9309,75012,46012,720.
Automatic Language Acquisition, an Interactive Approach † Robert J. Martin † 大西昇 ‡ 山村毅 † 名古屋大学 ‡ 愛知県立大学.
JPN 312 (Fall 2007): Conversation and Composition 文句 ( もんく ) を言う.
HKS Analysis Log Jul 2006 Part1 D.Kawama. 第壱部 HKS Sieve Slit Analysis.
1 中野研究室 4 年ゼミのイロハ 斉藤(修士 2 年) ( 2009 年 ”4 年ゼミのイロハ ” を参考に作りました)
移動エージェントプログラムの 動作表示のためのアニメーション言 語 名古屋大学情報工学コース 坂部研究室 高岸 健.
1 プログラミング言語論 第13回 プログラムの意味論と検証 (2) 表示的意味論 担当:犬塚. 2 表示的意味論 denotational semantics  表示的意味論では、プログラムの要素とそれが 意味するものを対応付ける。 変数 式 文 A B … A+2 2B+C A:=A+2 if.
プログラミングⅠ( 2 組) 第 1 回 / pLB1.pptx.
プログラミング入門2 第3回 複合文、繰り返し 情報工学科 篠埜 功.
メニューに戻る メニューに戻る | 前表示スライド 前表示スライド G*power 3 の web ページ Windows はこちら Mac はこちら ダウンロード後,実行してインストール.
第14回 プログラムの意味論と検証(3) 不動点意味論 担当:犬塚
実験5 規則波 C0XXXX 石黒 ○○ C0XXXX 杉浦 ○○ C0XXXX 大杉 ○○ C0XXXX 高柳 ○○ C0XXXX 岡田 ○○ C0XXXX 藤江 ○○ C0XXXX 尾形 ○○ C0XXXX 足立 ○○
ことばとコンピュータ 2007 年度 1 学期 第 1 回. 2 ことばとコンピュータ 授業科目名:言語情報処理論 授業題目名:ことばとコンピュータ 履修コード: 5067 教室: 323 一学期開講 授業の進め方 – 基本的に講義中心ですすめ,時々コンピュー タを使う.
音の変化を視覚化する サウンドプレイヤーの作成
プログラミングの基礎知識 プログラミングの手順と重要概念 アルゴリズム. プログラミングの手順 コーディング エディタなどでコードを記述 コンパイル・インタープリタ 実行可能な形に翻訳 デバッグ(虫取り、不具合の調整) 完成!
HCC Hair Color Change. メンバー ソ 渋谷麻美 ソ 渋谷麻美 ソ 清野理衣子 ソ 清野理衣子 ソ 三上貴大 ソ 三上貴大.
Self-efficacy(自己効力感)について
本文. 考えながら読みましょ う 「いろいろなこと」( 3 行目)は何で すか 「①電話料金はコンビニで支払いをしていま す。いつでも払えますから、便利です。」 「②夕食はコンビニで買います。お弁当やお かずがいろいろありますから。」今、若者に 人気のあるコンビニは、いろいろなことをす るのに非常に便利な場所になった。
腎臓移植 腎臓移植の前に、ドナー両方の腎臓は機 能的に良好でなければならない。ドナー の両方の腎臓が機能的に健康であること を保証するために、多数の試験が行われ ている。
地球儀と様々な地図. 1 球体としての地球 こうした現象はあることをイ メージすると理解できる。
Presentation transcript:

リファクタリング支援のための コードクローンに含まれる識別子の変更内容分析 井上研究室 工藤 良介 1

発表概要 2  保守コストを抑えるためコードクローンを集約する ことが提案されている  全てのコードクローンが集約できるわけではない  集約しやすいクローン, 困難なクローンの割合を調査 する

コードクローンとは 3  ソースコード中の同一, または類似したコード片  クローンのひとつにバグが見つかった場合, その他のクローンについ ても修正を検討する必要がある  コードクローンの存在が保守コストを増大させる要因となっている クローンとなっている コード片

コードクローンに対するリファクタリング 4  共通した処理を,単一のコードに集約する  全てのクローンが集約できるとは限らない hoge(); 手続きとして独立させ る 手続き呼出し に変更 集約 hoge(){ }

研究目的・内容 5  コードクローンのリファクタリングがどの程度適用で きるのかを確認する  集約が容易なクローン,集約が困難なクローンの割合 を調べる  調査対象  Java で書かれたオープンソースソフトウェア 2142 個  apache.commons , sourceforge.net から収集したもの

本研究で対象とするコードクローン 6  CCFinder が検出する “Parameterized” クローン … int y = getY(); System.out.println( “Freefall:”); int t =freefall(y) … int height = getY(); System.out.println( “Freefall:”); int time =freefall(height) … int y = getHeight(); System.out.println( “Freefall:”); int t =freefall(y) … 変数名が違う 手続き名が違 う

集約の容易なクローン, 困難なクローン 7  集約の容易なクローン  識別子名に変更のないクローン  変数名のみが変更されているクローン  手続きに引数を設定することで違いを吸収  集約の困難なクローン  型名が変更されているクローン  メソッド名が変更されているクローン  識別子の対応が 1 対 1 でないクローン

調査手法 8 1. ソースコード中のクローンを検出する 2. ソースコードに出現する識別子のリストを作成  出力する情報は { 識別子名, 出現位置, 種類 } 3. クローン中の識別子をリストから抽出し, 対応関係 を調査する  変更された識別子の種類  変更された識別子の対応関係 4. クローンを分類する

調査手法 9 1. ソースコード中のクローンを検出する 2. ソースコードに出現する識別子のリストを作成  出力する情報は { 識別子名, 出現位置, 種類 } 3. クローン中の識別子をリストから抽出し, 対応関係 を調査する  変更された識別子の種類  変更された識別子の対応関係 4. クローンを分類する

1 .コードクローンの検出 10  コードクローン検出ツール CCFinder を利用 … int y = getY(); System.out.println( “Freefall:”); int t =freefall(y) … int height = getY(); System.out.println( “Freefall:”); int time =freefall(height) … int y = getHeight(); System.out.println( “Freefall:”); int t =freefall(y) … 変数名が違う 手続き名が違 う

調査手法 ソースコード中のクローンを検出する 2. ソースコードに出現する識別子のリストを作成  出力する情報は { 識別子名, 出現位置, 種類 } 3. クローン中の識別子をリストから抽出し, 対応関係 を調査する  変更された識別子の種類  変更された識別子の対応関係 4. クローンを分類する

2 .識別子のリスト作成 12  出力する情報は { 識別子名, 出現位置, 種類 }  識別子の種類は { 変数, メソッド, 型, レシーバ, リテラル, そ の他 } とした

調査手法 ソースコード中のクローンを検出する 2. ソースコードに出現する識別子のリストを作成  出力する情報は { 識別子名, 出現位置, 種類 } 3. クローン中の識別子をリストから抽出し, 対応関係 を調査する  変更された識別子の種類  変更された識別子の対応関係 4. クローンを分類する

3 .識別子名の対応関係の調査 14  識別子名の対応関係を以下のように定義する  変更なし  識別子名は変わっていない  変更あり  1 対 1 対応  クローン間で識別子名をお互いに 1 対 1 で置換できる  N 対 N 対応  1 対 1 対応ではない識別子名の対応がある

例)識別子の対応関係 15 A=1; B=B+A; D=1; E=E+D; H=1; Y=Z+H; コード片 1 コード片 2 コード片 3 コード片 1 コード片 2 コード片 3 種類 1 対 1 対応変更なし ADH 変数 ○ × 111 リテラル ○ BEYZYZ 変数 ××

調査手法 ソースコード中のクローンを検出する 2. ソースコードに出現する識別子のリストを作成  出力する情報は { 識別子名, 出現位置, 種類 } 3. クローン中の識別子をリストから抽出し, 対応関係 を調査する  変更された識別子の種類  変更された識別子の対応関係 4. クローンを分類する

4 .クローンの分類 17 変数名 A ⇔ D ⇔ H ・・・・・・・・ 1 対 1 対応 変数名 B ⇔ E ⇔{ Y,Z} ・・・・・・・・ N 対 N 対応 1 対 1 でない変更があると 集約が難しい コード片 1 コード片 2 コード片 3 種類 1 対 1 対応変更なし ADH 変数 ○ × 111 リテラル ○ BEYZYZ 変数 ×× このクローンは「変数のみが変更されていて」「 1 対 1 でない変更を含む」と分 類

調査する点 18  集約の容易なクローン  識別子名に変更のないクローン  変数名のみが変わっていてその変更が全て 1 対 1 対応であ るクローン  集約の困難なクローン  型名が変わっているクローン  メソッド名が変わっているクローン  識別子の対応が 1 対 1 でないクローン

調査結果 19  調査対象  Java で書かれたオープンソースソフトウェア 2142 個  apache.commons , sourceforge.net から収集したもの  総クローン数  調査結果  集約の容易なクローン 26.0%  集約の困難なクローン 52.4%

調査結果 20 分類クローン 数 総クローン 数に対する 割合 全ての識別子が 1 対 1 対応 変更なし %100% 変数のみ変更 %91.2% 集約の期待できるクローン・・・ 26.0% 集約の難しいクローン ・・・ 52.4% 分類クローン 数 総クローン 数に対する 割合 全ての識別子が 1 対 1 対応 型が変更 %78.3% メソッドが変更 %74.0% 型またはメソッドが変 更 %75.5% 総クローン数

考察 21  集約が容易なクローンが全体の 4 分の 1 であった  これらのクローンを集約することで保守コストを下げる ことができる  また, 集約が困難なクローンも, その 4 分の 3 は識別子が 1 対 1 対応のクローンであった  違いを吸収する手法を確立できれば, 多くのクローンをリ ファクタリングすることができる

まとめ 22  コードクローンのリファクタリングがどの程度適用 できるのかを確認するために, 集約が容易なクローン, 集約が困難なクローンの割合を調べた  クローンになっているコード片の間で識別子を比較 し,識別子名の変更状況を調査した  実験の結果, 約 4 分の 1 のクローンで集約が容易なこと がわかった

識別子の分類 23  今回識別子を以下のように分類した。  変数  メソッド  型  レシーバ  リテラル  その他

調査結果 24 分類クローン数全体に対する割合 全体 変更なし % 変数のみ変更 % 型が変更 % メソッドが変更 % 型またはメソッドが変 更 % 分類全ての識別子が 1 対 1 対応 N 対 N 対応を含む 変数のみ変更 91.2%8.8% 集約の期待できるクローン・・・ 26.0% 集約の難しいクローン ・・・ 52.4%

実験結果 25  識別子名の変更なしのクローンが全体の 22.4% 、変数 名のみ変更されているクローンが 全体の 4% でその うち 86% が 1 対 1 対応の変更であった  集約の期待されるクローン  型またはメソッド名の変更されたクローンは全体の 52.3% であった  集約の難しいクローン

考察 26  全クローンのうち約 4 分の 1 で集約が期待できること がわかった。  提案されているコードクローンのリファクタリング 手法は十分有用であると言える。  しかし、集約可能でも実際には行うべきでないケー スも存在することに留意しなければならない。

例)識別子の対応関係 27 a=1; b=b+1; … a=c; a=1; b=b+1; … a=c; a=1; b=b+1; … a=c; 変更なし 1 対 1 対応 a=1; b=b+1; … a=c; d=1; e=e+1; … d=f; g=1; h=h+1; … g=i; a ⇔ d ⇔ g b ⇔ e ⇔ h と 対応 c ⇔ f ⇔ i N 対 N 対応 a=1; b=b+1; … a=c; d=1; f=g+1; … i=c; k=1; f=g+1; … a=l; a ⇔ d,i ⇔ k,a ….. とバラバラ

調査結果 28 分類クローン数全体に対する割合 全体 変更なし % 変数のみ変更 % リテラルのみ変更 % 型が変更 % メソッドが変更 % 型またはメソッドが変 更 % 分類全ての識別子が 1 対 1 対応 N 対 N 対応を含む 変数のみ変更 85.5%14.5%

おわり 29

30

コードクローンとは (2) 31  コードクローンは 3 つのタイプに分けられる。  タイプ 1 :空白、改行などを除き同一のもの  タイプ 2 :変数名や型名など識別子名が変わったもの  タイプ 3 :一部に文の挿入や削除が行われたもの  本研究ではタイプ 1 およびタイプ 2 のコードクローン を扱う。

コードクローンのリファクタリング (1) 32  コードクローンの存在は保守コストを増大させるの で好ましくない。  コードクローンを除去するためのリファクタリング 手法が提案されている。  リファクタリング:外部からみた動作を変えずに、内部構造を整理する こと

背景 ( 非表示 ) 33  Yii Yong Lee の研究で、クローンペア間での識別子名の 変更によるバグの生成についての調査が行われた。  今回は一般化し、バグ検出という視点ではなく、どの ように識別子名の変更が行われているかを調査したい。

調査対象 34  Java で書かれたソースファイルを対象とする  研究対象として、以下のドメインから集めたオープ ンソースソフトウェアのデータセットを利用する  apache.commons  sourceforge.net  sourceforge.net.DB  ツールの実行対象はプロジェクト単位  全 2142 プロジェクト

実験準備 35  実験を行うためにクローン間の識別子の変更内容を 割り出すツールを作成  今回は Java ファイルのみを対象とする

実験用ツール概略図 36 Java ファイル CCFinder リスト作成 コードクローン情報識別子リスト 比較 識別子情報

実験用ツール 37  クローン検出には既存のツール CCFinder を使用  タイプ 1 および 2 のクローンを検出  クローンとして検出するのは 30 トークン以上のコード片  Java ファイルから識別子を抜き出しリストを作成する プログラムを用意  CCFinder の出力結果と識別子リストの比較により識 別子の変更情報を得る

38