ソースコード差分検出を用いた 探索的手法による impure リファクタリングの検出

Slides:



Advertisements
Similar presentations
ゲームプログラミング講習 第2章 関数の使い方
Advertisements

サービス管理責任者等研修テキスト 分野別講義    「アセスメントと        支援提供の基本姿勢」 <児童発達支援管理責任者> 平成27年10月1日.
ヒトの思考プロセスの解明を目的とするワーキングメモリの研究
第27講 オームの法則 電気抵抗の役割について知る オームの法則を使えるようにする 抵抗の温度変化を理解する 教科書P.223~226
コラッツ予想の変形について 東邦大学 理学部 情報科 白柳研究室 山中 陽子.
コンパイラ 第3回 字句解析 ― 決定性有限オートマトンの導出 ―
第5章 家計に関する統計 ー 経済統計 ー.
公共財 公共経済論 II no.3 麻生良文.
VTX alignment D2 浅野秀光 2011年12月15日  放射線研ミーティング.
冷却フランシウム原子を用いた 電子の永久電気双極子能率探索のための ルビジウム磁力計の研究
生命情報学 (8) スケールフリーネットワーク
前半戦 「史上最強」風 札上げクイズ.

認知症を理解し 環境の重要性について考える
フッ化ナトリウムによる洗口 2010・9・13 宮崎市郡東諸県郡薬剤師会 学校薬剤師  日高 華代子.
食品の安全性に関わる社会システム:総括 健康弱者 ハイリスク集団 HACCP (食肉処理場・食品工場) 農場でのQAP 一般的衛生管理
規制改革とは? ○規制改革の目的は、経済の活性化と雇用の創出によって、   活力ある経済社会の実現を図ることにあります。
地域保健対策検討会 に関する私見(保健所のあり方)
公共政策大学院 鈴木一人 第8回 専門化する政治 公共政策大学院 鈴木一人
医薬品ネット販売規制について 2012年5月31日 ケンコーコム株式会社.
平成26年8月27日(水) 大阪府 健康医療部 薬務課 医療機器グループ
平成26年度 呼吸器学会からの提案結果 (オレンジ色の部分が承認された提案) 新規提案 既収載の変更 免疫組織化学染色、免疫細胞化学染色
エナジードリンクの危険性 2015年6月23日 経営学部市場戦略学科MR3195稲沢珠依.
自動吸引は 在宅を変えるか 大分協和病院 院長         山本 真.
毎月レポート ビジネスの情報 (2016年7月号).
医療の歴史と将来 医療と医薬品産業 個人的経験 3. 「これからの医療を考える」 (1)医薬品の研究開発 -タクロリムスの歴史-
社会福祉調査論 第4講 2.社会調査の概要 11月2日.
2015年12月28日-2016年3月28日 掲載分.
2010度 民事訴訟法講義 補論 関西大学法学部教授 栗田 隆.
腫瘍学概論 埼玉医科大学国際医療センター 包括的がんセンター 緩和医療科/緩和ケアチーム 奈良林 至
“企業リスクへの考え方に変化を求められています。 トータルなリスクマネジメント・サービスをプロデュースします。“
情報漏えい 経済情報学科 E  西村 諭 E  釣 洋平.
金融班(ミクロ).
第11回 2009年12月16日 今日の資料=A4・4枚+解答用紙 期末試験:2月3日(水)N2教室
【ABL用語集】(あいうえお順) No 用語 解説 12 公正市場価格 13 債権 14 指名債権 15 事業収益資産 16 集合動産 17
基礎理論(3) 情報の非対称性と逆選択 公共政策論II No.3 麻生良文.
浜中 健児 昭和42年3月27日生まれ 東京都在住 株式会社ピー・アール・エフ 代表取締役 (学歴) 高 校:千葉県立東葛飾高校 卒業
COPYRIGHT(C) 2011 KYUSHU UNIVERSITY. ALL RIGHTS RESERVED
Blosxom による CMS 構築と SEO テクニック
記入例 JAWS DAYS 2015 – JOB BOARD 会社名 採用職種 営業職/技術職/その他( ) 仕事内容 待遇 募集数
ネットビジネスの 企業と特性 MR1127 まさ.
Future Technology活用による業務改革
ネットビジネス論(杉浦) 第8回 ネットビジネスと情報技術.
g741001 長谷川 嵩 g740796 迫村 光秋 g741000 西田 健太郎 g741147 小井出 真聡
自然独占 公共経済論 II no.5 麻生良文.
Autonomic Resource Provisioning for Cloud-Based Software
Webショップにおける webデザイン 12/6 08A1022 甲斐 広大.
物理的な位置情報を活用した仮想クラウドの構築
ハイブリッドクラウドを実現させるポイントと SCSKのOSSへの取組み
寺尾 敦 青山学院大学社会情報学部 第12回 情報デザイン(4) 情報の構造化と表現 寺尾 敦 青山学院大学社会情報学部
【1−1.開発計画 – 設計・開発計画】 システム開発計画にはシステム開発を効率的、効果的に実行する根拠(人員と経験、開発手順、開発・導入するシステム・アプリケーション・サービス等)を記述すること。 システム開発の開始から終了までの全体スケジュールを記載すること。 アプリケーション機能配置、ソフトウェア、インフラ構成、ネットワーク構成について概要を示すこと。
6 日本のコーポレート・ガバナンス 2008年度「企業論」 川端 望.
急成長する中国ソフトウェア産業 中国ソフトウェアと情報サービス産業の規模 総売上高は5年間で約5.3倍の成長
米国ユタ州LDS病院胸部心臓外科フェローの経験
公益社団法人日本青年会議所 関東地区埼玉ブロック協議会 JCの情熱(おもい)育成委員会 2011年度第1回全体委員会
次世代大学教育研究会のこれまでの活動 2005年度次世代大学教育研究大会 明治大学駿河台校舎リバティタワー9階1096教室
子どもの本の情報 大阪府内の協力書店の情報 こちらをクリック 大阪府内の公立図書館・図書室の情報
第2回産業調査 小島浩道.
〈起点〉を示す格助詞「を」と「から」の選択について
広東省民弁本科高校日語専業骨幹教師研修会 ①日本語の格助詞の使い分け ②動詞の自他受身の選択について   -日本語教育と中日カルチャーショックの観点から- 名古屋大学 杉村 泰.
■5Ahバッテリー使用報告 事例紹介/東【その1】 ■iphon4S(晴れの昼間/AM8-PM3) ◆約1時間で68%⇒100%
『ワタシが!!』『地域の仲間で!!』 市民が始める自然エネルギー!!
ポイントカードの未来形を形にした「MUJI Passport」
SAP NetWeaver を支える Microsoft テクノロジーの全貌 (Appendix)
ガイダンス(内業) 測量学実習 第1回.
Python超入門 久保 幹雄 東京海洋大学.
熱力学の基礎 丸山 茂夫 東京大学大学院 工学系研究科 機械工学専攻
京都民医連中央病院 CHDF学習推進委員会
資料2-④ ④下水道.
Accessによる SQLの操作 ~実際にテーブルを操作してみよう!~.
Presentation transcript:

ソースコード差分検出を用いた 探索的手法による impure リファクタリングの検出 ○堤祥吾1 吉田則裕2 崔恩瀞3 井上克郎1 1大阪大学 2名古屋大学 3奈良先端科学技術大学院大学

リファクタリング ソフトウェアの外部的振る舞いを保ったまま内部の構造を改善していく作業[1] コードの保守性や読みやすさを高める目的 [1] M. Fowler,“Refactoring:Improving the Design of Existing Code.” Addison Wesley,1999.

メソッド引き上げリファクタリングにより, リファクタリング例 abstract class Customer{ … } class RegularCustomer extends Customer{ int calcTax(int amount){ … } } class PremiumCustomer abstract class Customer{ int calcTax(int amount){ … } } class RegularCustomer extends Customer{ … } class PremiumCustomer メソッド引き上げリファクタリングにより, コードがまとまり保守性・可読性が高まる

Impureリファクタリング バージョン間,コミット間の変更の際 複数のリファクタリングが同時適用されている リファクタリング,非リファクタリング変更が混在して適用されている

Impureリファクタリング例 メソッド引き上げ(青枠)に加え, 非リファクタリング変更(赤)が行われた abstract class Customer{ … } class RegularCustomer extends Customer{ int calcTax(int amount){ … } } class PremiumCustomer abstract class Customer{ double calcTax(int amount){ … } } class RegularCustomer extends Customer{ … } class PremiumCustomer メソッド引き上げ(青枠)に加え, 非リファクタリング変更(赤)が行われた

リファクタリング検出必要性 リファクタリングがソースコードの品質に与える影響に関心が持たれている リファクタリングに関する調査を行うために,ソースコードから自動的にリファクタリングを検出するためのツールが必要となる … void func(){ a = calc(); } int calc(){ … void func(){ a = 3 + 5; } メソッド抽出 フィールド引き上げ …

研究背景 複数のリファクタリングや非リファクタリングが同時に適用されている場合,現状では検出が難しい 探索的手法を用いることで,複数のリファクタリングが適用されていても検出する研究がされている[2] [2] Hayashi, et al,“Search-Based Refactoring Detection from Source Code Revisions”, IEICE Transactions on Information and Systems, 2010.

先行研究の手法 コミットAからコミットBの間に行われたリファクタリングを検出したい メソッド抽出 リネーム 定数置き換え コミットB リネーム その他 リファクタリング フィールド 引き上げ …

先行研究[2]の課題 先行研究では,複数のリファクタリング操作列を探索によって検出する 非リファクタリングの変更が混在する場合にはうまく検出されない(impureリファクタリング) ソースコード差分検出を用いることにより,impureリファクタリングも検出できるようにする [2] Hayashi, et al, “Search-Based Refactoring Detection from Source Code Revisions”, IEICE Transactions on Information and Systems, 2010.

本手法の特徴 探索的リファクタリングを用いることにより,複数のリファクタリングが重ねて適用されていても検出が可能 非リファクタリング変更が行われていても検出が可能であり,リファクタリングと区別して検出することができる

提案手法の手順 テストによる 探索的 動作確認 リファクタリング検出 コミット 取り出し 非リファクタリング差分の検出 旧 実行結果の 3 2 コミット 取り出し 旧 1 実行結果の 一致を確認 旧 非リファクタリング差分の検出 4 新 新 … a = 3 – a a = b + 5 * a 最終状態 新版コード 出力

Step 2(1/3):探索の手順 初期状態 𝑠 0 (旧版コード)を,新版コード 𝑠 𝑛 との差分(評価値)とともにキューに入れる キューから評価値最良の状態を取り出す( 𝑠 𝑖 とする) 𝑠 𝑖 と 𝑠 𝑛 とを比較し,適用された可能性のあるリファクタリングを列挙 列挙されたリファクタリングを 𝑠 𝑖 に適用し,評価値を計算し,それぞれキューに入れる 終了条件を満たせば評価値最良の状態 𝑠 𝑡 を探索結果とし,そうでなければ2へ 0.85 メソッド抽出 フィールド引上 … 0.90 0.65 0.60

評価関数⁡𝐹( 𝑠 𝑖 ) := 𝑗=1 𝑛 𝑑 𝑗 𝑗=1 𝑛 max⁡( 𝑡 𝐴𝑗 , 𝑡 𝐵𝑗 ) Step 2(2/3):探索順を定める 評価関数 𝑠 𝑖 と 𝑠 𝑛 との編集距離を𝑑 比較はメソッドごとに行い,比較するメソッドのそれぞれのトークン数を 𝑡 𝐴 , 𝑡 𝐵 とする 各ファイルについて求めるので,それぞれ( 𝑑 1 , 𝑑 2 ,…, 𝑑 𝑛 ), ( 𝑡 𝐴1 , 𝑡 𝐵1 , …,[ 𝑡 𝐴𝑛 , 𝑡 𝐵𝑛 ])とする 評価関数⁡𝐹( 𝑠 𝑖 ) := 𝑗=1 𝑛 𝑑 𝑗 𝑗=1 𝑛 max⁡( 𝑡 𝐴𝑗 , 𝑡 𝐵𝑗 ) 𝑡 𝐴 𝑗 + 𝑡 𝐵 𝑗 論文ではmaxとなっているが誤りで, 正しくは和を用いている

Step 2(3/3):評価関数の例 ⁡𝐹( 𝑠 𝑖 ) := 0+7 8+8+18+13 ≒ 0.27 A B メソッド名 𝒕 𝑨 𝒕 𝑩 abstract class Customer{ abstract int calc(int value); int calcTax(int amount){ return (int)(amount * 1.08); } abstract class Customer{ abstract int calc(int value); int double calcTax(int amount){ return (int)(amount * 1.08); } メソッド名 𝒕 𝑨 𝒕 𝑩 編集距離d calc 8 calcTax 18 13 7 ⁡𝐹( 𝑠 𝑖 ) := 0+7 8+8+18+13 ≒ 0.27

Step 3:テストによる動作確認 ツールがリファクタリングを正しく適用した場合は動作を変更しない しかし,適切なコード変換が行われなかった場合はその限りではない 探索段階で正しくリファクタリングを適用できたかを確認する必要がある 𝑠 0 と 𝑠 𝑡 のテスト結果を比較する

Step 4(1/2):非リファクタリング差分検出 探索ではリファクタリング操作の適用しか行わない 非リファクタリング変更が存在する場合,探索後のコード 𝑠 𝑡 と新版コード 𝑠 𝑛 に必ず差分が生じる 非リファクタリング差分 メソッドの引き上げ メソッド抽出 旧版コード 新版コード 状態1 状態3

Step 4(2/2):差分の求め方 𝑠 𝑡 と 𝑠 𝑛 との差分を求め,それを非リファクタリング差分とする トークン列同士の編集距離を求める abstract class Customer{ abstract int calc(int value); int calcTax(int amount){ return (int)(amount * 1.08); } abstract class Customer{ abstract int calc(int value); int double calcTax(int amount){ return (int)(amount * 1.08); } doubleの挿入 int, カッコの削除 により,編集距離は7

適用例 公開リファクタリングデータベース[3]から,impureリファクタリングが含まれるコミットを目視で選択 Apache Xerces を除き,それぞれ別のコミットとなる リファクタリングが含まれるファイルに対し,本手法を適用した [3] G. Bavota et al. “An Experimental investigation on the Innate Relationship between Quality and Refactoring.” Journal of Systems and Software, 2015.

各適用対象の情報 プロジェクト クラス 旧クラス トークン数 追加 削除 Apache Xerces DocumentImpl 3391 9 83 CoreDocumentImpl 3464 631 1 Apache Ant Launcher 1170 253 108 ComponentHelper 3790 432 343 AntTypeDefinition 1165 268 113 Main 2607 453 368 Project 5155 222 34 TarEntry 1691 229 192

探索例(DocumentImpl) 色 対象メンバ リファクタリングの 種類 黄色 userData フィールド引き上げ 緑色 旧版コード 0.10094 1 3 色 対象メンバ リファクタリングの 種類 黄色 userData フィールド引き上げ 緑色 setUserData メソッド 引き上げ 青色 getUserData 0.09988 2 13 0.09869 8 12 0.09794 0.09763 4 9 5 11 0.09687 0.09567 0.09567 7 6 10 0.09460 0.09460

差分検出段階 探索段階にてリファクタリング検出後,差分検出を行った 探索直後cloneNode 差分適用後cloneNode public Node cloneNode(boolean deep) { DocumentImpl newdoc = new DocumentImpl(); cloneNode(newdoc, deep); // experimental newdoc.mutationEvents = mutationEvents; return newdoc; } // cloneNode(boolean):Node public Node cloneNode(boolean deep) { CoreDocumentImpl newdoc = new CoreDocumentImpl(); callUserDataHandlers(this, newdoc, UserDataHandler.NODE_CLONED); cloneNode(newdoc, deep); newdoc.mutationEvents = mutationEvents; return newdoc; } // cloneNode(boolean):Node

検出されたリファクタリング リファクタリング検出段階において検出された数を表に示す All – 実際に含まれる数 Find – 検出された数 クラス All Find DocumentImpl (CoreDocumentImpl) 3 Launcher 4 ComponentHelper AntTypeDefinition 2 Main 1 Project TarEntry リファクタリング検出段階において検出された数を表に示す All – 実際に含まれる数 Find – 検出された数 リファクタリングの誤検出はなかった 検出されなかったリファクタリングはいくつか見られた

検出できなかった例 抽出する内容が例外処理を必要とするものであったが,編集距離だけでは追加できず private Object createAndSet(...) { try { java.lang.reflect.Constructor ctor = null; boolean noArg = false; try {...} catch (...) { ... } return o; } catch (...) { private Object createAndSet(...) { try { Object o = innerCreateAndSet(c, project); return o; } catch (...) { ... } public Object innerCreateAndSet(...) throws ...Exception, { Constructor ctor = null; boolean noArg = false; try {...} catch (...) { 旧AntTypeDefinition.java 抽出する内容が例外処理を必要とするものであったが,編集距離だけでは追加できず 新AntTypeDefinition.java 例外処理を検知し追加する処理が必要

検出できた例 いくつかの非リファクタリング変更が加わりつつも, 子クラスから親クラスへのメソッド引き上げを検出した public Node cloneNode(boolean deep) { DocumentImpl newdoc = new DocumentImpl(); cloneNode(newdoc, deep); // experimental newdoc.mutationEvents = mutationEvents; return newdoc; } // cloneNode(boolean):Node public Node cloneNode(boolean deep) { CoreDocumentImpl newdoc = new CoreDocumentImpl(); callUserDataHandlers(this, newdoc, UserDataHandler.NODE_CLONED); cloneNode(newdoc, deep); return newdoc; } // cloneNode(boolean):Node 新CoreDocumentImpl.java 旧DocumentImpl.java いくつかの非リファクタリング変更が加わりつつも, 子クラスから親クラスへのメソッド引き上げを検出した

考察 すべて正しくリファクタリングされたのは8つのファイルのうち4つであった そうでないファイルについては,いくつか正しく検出できないリファクタリングが存在した 検出できない場合 例外処理を含む場合 ブロック・行をまたぐ機能抽出があった場合

まとめ 探索的手法と,ソースコード差分検出を組み合わせた手法を提案した 既存手法では難しかったimpureリファクタリング検出を可能とした 今後の課題 検出精度の向上 検出可能なリファクタリングの種類を増やす 探索範囲となるファイルやクラスを増やす