相関ルールマイニングを用いた メソッドの命名方法の分析

Slides:



Advertisements
Similar presentations
ソフトウェア工学 理工学部 情報システム工学科 新田直也. 演習問題 1 の解答例  入庫処理の DFD 酒屋の在庫問題の DFD( 入庫処理 ) 更新情報 在庫ファイル 更新処理 倉庫係 在庫不足リスト 在庫ファイル 出庫指示書 新規出庫 判定 出庫指示書 作成処理 出庫依頼 積荷票.
Advertisements

シーケンス図の生成のための実行履歴圧縮手法
シーケンシャルパターンマイニングに基づくオブジェクト指向プログラムのための 欠陥検出手法
プログラミング基礎I(再) 山元進.
メソッド周辺の識別子と メソッド本体のAPI利用実績に基づいたAPI集合推薦手法
アルゴリズムとデータ構造1 2007年6月12日
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
アクセス修飾子過剰性の変遷に着目したJavaプログラム部品の分析
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
動詞に着目した相関ルールを利用するメソッド名の命名支援手法の評価
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
アルゴリズムとデータ構造 2011年6月20日
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
~手続き指向からオブジェクト指向へ[Ⅱ]~
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
11.6 ランダムアクセスファイル 11.7 StreamTokenizerクラス
ソースコード中に出現する 動詞-目的語関係を利用した メソッド名の命名支援手法
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
オブジェクト指向 プログラミング 第十一回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
ポインタ解析におけるライブラリの スタブコードへの置換の効果
Collection, Generics, Iterator
Javaプログラムの変更を支援する 影響波及解析システム
オブジェクト指向 プログラミング 第七回 知能情報学部 新田直也.
プログラム動作理解支援を目的とした オブジェクトの振舞いの同値分割手法
Java8について 2014/03/07.
コードクローンの動作を比較するためのコードクローン周辺コードの解析
コードクローン検出に基づくデザイン パターン適用支援手法の提案と実現
プログラムで多用される 動詞と目的語の関係を利用した メソッド名提案ツール
不確実データベースからの 負の相関ルールの抽出
プログラム理解におけるThin sliceの 統計的調査による有用性評価
オブジェクト指向 プログラミング 第十ニ回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
オブジェクト指向 プログラミング 第九回 知能情報学部 新田直也.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第八回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
プログラムスライスを用いた凝集度メトリクスに基づく 類似メソッド集約候補の順位付け手法
設計情報の再利用を目的とした UML図の自動推薦ツール
オープンソースソフトウェアに対する コーディングパターン分析の適用
計算機プログラミングI 第4回 2002年10月31日(木) 問題解決とアルゴリズム クラスメソッドと手続きの抽象化 最大公約数
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
欠陥検出を目的とした類似コード検索法 吉田則裕,石尾隆,松下誠,井上克郎 大阪大学 大学院情報科学研究科
ソフトウェア理解支援を目的とした 辞書の作成法
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
アルゴリズムとデータ構造 2012年6月21日
コードクローン解析に基づく デザインパターン適用候補の検出手法
回帰テストにおける実行系列の差分の効率的な検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
プログラム依存グラフを用いた ソースコードのパターン違反検出法
Presentation transcript:

相関ルールマイニングを用いた メソッドの命名方法の分析 ○柏原 由紀1,鬼塚 勇弥1,石尾 隆1,早瀬 康裕2,山本 哲男3,井上 克郎1 [TODO]命名相関ルールという語を出すかどうか.出すならいつ出すか. 1 大阪大学 大学院情報科学研究科 2 筑波大学 システム情報系 3 日本大学 工学部情報工学科

目次 オブジェクト指向プログラムにおけるメソッド名の命名の問題点 相関ルールマイニングの利用手法 調査の内容および結果 まとめと今後の課題

目次 オブジェクト指向プログラムにおけるメソッド名の命名の問題点 相関ルールマイニングの利用手法 調査の内容および結果 まとめと今後の課題

値を書き込むためのオブジェクトを取得する 背景 メソッド名が不適切だとプログラム理解に時間がかかる[1] 開発者は識別子の名前から動作を推測している 不適切な名前がついていると動作を誤解する setだから 値を設定している? ・・・ java.sql.Blob のインターフェースの例 [TODO]引用 実は 値を書き込むためのオブジェクトを取得する [1]D. Lawrie, C. Morrell, H. Feild, and D. Binkley. What‘s in a name? a study of identiers. In Proceedings of the 14th IEEE ICPC

どの動詞が使われているのか明らかではない メソッドの命名 一般的なガイドライン[2] メソッドの動作と対象を示す名前をつけるべき 動詞+目的語(open+BinaryStream)で命名するべき よく知られた動詞 get,set : フィールドアクセスを行うメソッドに使う どのようなメソッドに対して どの動詞が使われているのか明らかではない [TODO]引用 [2] S. McConnell. Code Complete, Second Edition. Microsoft Press, 2004

研究概要 メソッドの命名に使われる動詞の規則を調査 JavaのOSSプロジェクトを対象 相関ルールマイニングを利用 メソッド定義に使われている識別子を抽出 メソッドの動作を表していると仮定 メソッド本体とメソッド名の関係を表す相関ルールを抽出 多くのプログラムで頻出している関係がそのメソッドを理解しやすい関係であると仮定 抽出したルールを分析 開発者は規則に沿った命名ができるようになる メソッド名の変更の候補を提示できるようになる

命名相関ルール メソッドの定義に用いる識別子とメソッド名の動詞の関係を表す相関ルール 条件部:メソッド定義に用いる識別子 帰結部:メソッド名の動詞 例: 返り値がbooleanであるメソッドの動詞はisであることが多い 親クラスがListであるクラスに定義されているメソッド の動詞はaddであることが多い

目次 オブジェクト指向プログラムにおけるメソッド名の命名の問題点 相関ルールマイニングの利用手法 調査の内容および結果 まとめと今後の課題

相関ルールマイニング[3] トランザクション集合内で同時に出現しやすいアイテム集合の関係を見つける手法 確信度:条件部が出現するときに帰結部が出現する条件付き確率 トランザクション集合 相関 ルールマイニング   確信度 {オムツ}→{ビール} 1(3/3) {パン} →{ビール} 0.66(2/3) {ビール} →{オムツ} 0.75(3/4) ・・・ A パン 牛乳 B ビール オムツ C D E ・オムツを買う人は同時にビールを買うことが多い [2] R. Agrawal, T. Imielinski, and A. Swami. Mining association rules between sets of items in large databases. In Proceedings of the 1993 ACM

本研究における相関ルールマイニング トランザクション集合 相関ルールマイニング … 条件部 帰結部 確信度 メソッド1 メソッド名の動詞 :find 呼び出しメソッド名 :addProject 返り値の型: :String … メソッド2 :add メソッド名の目的語 :Int 呼び出しメソッド名: :addName メソッド3 :run クラス名 :Counter 返り値の型 :void メソッド1000 相関ルールマイニング 条件部   帰結部 確信度 {返り値の型:String}    {メソッド名の動詞:find} 0.3 {呼び出しメソッド名:addName}    {メソッド名の動詞:add} 0.8 {返り値の型:void,クラス名:Counter}   {メソッド名の動詞:run}  0.6  

命名相関ルールの抽出:概要 ソースコードから分析対象の命名相関ルールを抽出する 1:メソッドからトランザクションを取得 2:相関ルールマイニングの適用 ソースコード集合 3:命名相関ルールの フィルタリング X → Y トランザクション集合 X → Y 命名相関ルール 分析対象の命名相関ルール

1.メソッドからトランザクションを取得 メソッド名の動詞 メソッド定義に用いる識別子 メソッド内部の要素 メソッド外部の要素 返り値の型 引数の型と名前 呼び出しているメソッド名 アクセスしているフィールド名 クラス名,親クラス名 インターフェース名 メソッド内部の要素 public class NameList implements Serializable { LinkedList<String> namelist; int size; public String findName(String n){ if (namelist.contains(n)) { return n; } return null; public void setName(Integer size) { this.size = size; メソッド外部の要素 メソッド名の動詞:find 返り値の型:String クラス名:NameList  …

分析対象外とするメソッド mainメソッド 匿名クラスに定義されているメソッド get,set,testの動詞が使われているメソッド Javaの言語規約で定められている 匿名クラスに定義されているメソッド ほとんどがオーバーライドで使われる get,set,testの動詞が使われているメソッド 使い方が確立している toString,hashCode,equalsメソッド Javaの基底クラスに定義されているメソッドでオーバーライドして使われる

2.相関ルールマイニングの適用 トランザクション集合 相関ルールマイニング … 条件部 帰結部 確信度 メソッド1 メソッド名の動詞 :find 呼び出しメソッド名 :addProject 返り値の型: :String … メソッド2 :add メソッド名の目的語 :Int 呼び出しメソッド名: :addName メソッド3 :run クラス名 :Counter 返り値の型 :void メソッド1000 相関ルールマイニング 条件部   帰結部 確信度 {返り値の型:String}    {メソッド名の動詞:find} 0.3 {呼び出しメソッド名:addName}    {メソッド名の動詞:add} 0.8 {返り値の型:void,クラス名:Counter}   {メソッド名の動詞:run}  0.6  

3.命名相関ルールのフィルタリング 20個以上のメソッドに対して成り立つもの 条件部の要素が4個以下のもの よく使われているルールを抽出するため 条件部の要素が4個以下のもの 手作業で分析を行うため

目次 オブジェクト指向プログラムにおけるメソッド名の命名の問題点 相関ルールマイニングの利用手法 調査の内容および結果 まとめと今後の課題

命名相関ルールの抽出 445個のオープンソースソフトウェア 抽出した命名相関ルール sourceforge.org,eclipse.org,apache.org 総対象メソッド数:764,303個 抽出した命名相関ルール 1,475,419個 ルールが抽出されたメソッドの数:594,439個(77.8%)

抽出した命名相関ルールの特徴 メソッド名はメソッド内部の要素に関連が強い 99.9% 内部の要素が処理を表しているからだと考える 1つ以上のメソッド内部の要素および外部の要素を含むルールの割合 99.9% 25.7% 含むルールの割合 含んでいないルールの割合

調査の内容 どのくらいの命名相関ルールが適用されるか 命名相関ルールは他のソフトウェアに対して適用できるか メソッドとその名前にどのような規則があるか [TODO]見づらすぎる

命名相関ルールを適用する メソッド定義に使われる識別子から既についているメソッドの動詞を出すこと 対象メソッドに対して条件を満たす命名相関ルールを選択する 同じ動詞を帰結部に持つ命名相関ルールのうち確信度が一番高いもののみ取得する 取得した命名相関ルールを確信度順に順位づけを行う 対象メソッドと同じ動詞を帰結部に持つ命名相関ルールがあるかどうか確認する その命名相関ルールの順位によって適用の度合いを評価する

適用方法 : 例 public void copyFile( … ) { read(); … write(); close(); } public void copyFile( … ) { read();  … write();  close(); }                         確信度 {呼び出しメソッド名: write, 呼び出しメソッド名: read} → {メソッド名の動詞: copy}  0.8 {呼び出しメソッド名: close}     → {メソッド名の動詞: close} 0.3 {呼び出しメソッド名: read , フィールド名: list}     →{メソッド名の動詞: add} 0.7 {呼び出しメソッド名: write, 呼び出しメソッド名: close} →{メソッド名の動詞: copy} 0.6   確信度 {呼び出しメソッド名: write, 呼び出しメソッド名: read} → {メソッド名の動詞: copy}  0.8 {呼び出しメソッド名: close}     → {メソッド名の動詞: close} 0.3 {呼び出しメソッド名: write, 呼び出しメソッド名: close} →{メソッド名の動詞: copy} 0.6                         確信度 {呼び出しメソッド名: write, 呼び出しメソッド名: read} → {メソッド名の動詞: copy}  0.8 {呼び出しメソッド名: close}     → {メソッド名の動詞: close} 0.3 {呼び出しメソッド名: read , フィールド名: list}     →{メソッド名の動詞: add} 0.7 {呼び出しメソッド名: write, 呼び出しメソッド名: close} →{メソッド名の動詞: copy} 0.6 1 1 2 1.条件を満たす命名相関ルールを選択する 2.同じ動詞を帰結部に持つ命名相関ルールのうち確信度が一番高いもののみ取得する 3.取得した命名相関ルールを確信度順に並べて順位づけを行う 4.対象メソッドと同じ動詞を帰結部に持つ命名相関ルールがあるか確認する 1.条件を満たす命名相関ルールを選択する 2.同じ動詞を帰結部に持つ命名相関ルールのうち確信度が一番高いもののみ取得する 3.取得した命名相関ルールを確信度順に並べて順位づけを行う 4.対象メソッドと同じ動詞を帰結部に持つ命名相関ルールがあるか確認する 1.条件を満たす命名相関ルールを選択する 2.同じ動詞を帰結部に持つ命名相関ルールのうち確信度が一番高いもののみ取得する 3.取得した命名相関ルールを確信度順に並べて順位づけを行う 4.対象メソッドと同じ動詞を帰結部に持つ命名相関ルールがあるか確認する 1.条件を満たす命名相関ルールを選択する 2.同じ動詞を帰結部に持つ命名相関ルールのうち確信度が一番高いもののみ取得する 3.取得した命名相関ルールを確信度順に並べて順位づけを行う 4.対象メソッドと同じ動詞を帰結部に持つ命名相関ルールがあるか確認する public void copyFile(File inputfile,File outputfile) throwsIOException{ try{ BufferedReader br=newBufferedReader (newInputStreamReader(newFileInputStream(inputfile))); BufferedWriter bw=newBufferedWriter (newOutputStreamWriter(newFileOutputStream(outputfile))); intc; while((c=br.read())!=-1){ bw.write((char)c); } }finally{ br.close(); bw.close(); } }

1 : どのくらいの命名相関ルールが適用されるか 方法 対象 命名相関ルールの抽出に用いたメソッド群 メソッド総数: 764,303 手順 各メソッドに命名相関ルールを適用する 少なくとも1つのメソッドに対して既についている動詞を出したことがある命名相関ルールの数を数える

1 : どのくらいの命名相関ルールが適用されるか 結果 メソッド総数に対して使われているルールの数が少ない 抽出された命名相関ルールの数: 1,475,419 適用された命名相関ルールの数: 93,186 順位づけに用いたルールの数: 192,802 メソッド総数: 764,303

2:命名相関ルールは 他のソフトウェアにも適用できるか 方法 対象 命名相関ルールの抽出に用いていないソフトウェアのメソッド群 ArgoUML :対象メソッド数6,651 jEdit :対象メソッド数2,676 手順 命名相関ルールを適用する 既についている動詞を帰結部にもつ命名相関ルールの順位をメソッド数ごとに数える

2:命名相関ルールは 他のソフトウェアにも適用できるか 結果 他のソフトウェアにも適用できると考えられる 92.1%のメソッドに適用できた(うち60.6%が10位以内) 順位 jEdit ArgoUML 対象メソッド数 6,651 対象メソッド数 2,676 メソッド数

3:メソッドとその名前にどのような規則があるか 方法 対象 命名相関ルールの抽出に用いたメソッド群 手順 命名相関ルールを適用する 少なくとも1つのメソッドに対して既についている動詞と帰結部が一致したことがある命名相関ルールを目視で調査 適用された命名相関ルールの数: 93,186 ランダムサンプリング

3:メソッドとその名前にどのような規則があるか 結果(1/4) 代表的な4つの規則を見つけた 呼び出しメソッド名の動詞と同じ動詞である 例:addメソッドを呼び出しているメソッドの動詞はaddであることが多い 帰結部がaddであるルール5,562個のうち,1,762 個のルールの条件部にaddが含まれる public static void addResourceLocation(String location) { if (!containsLocation(location)) { resourceLocations.add(location); } Argo:org.argouml.application.helpers.ResourceLoader.java

3:メソッドとその名前にどのような規則があるか 結果(2/4) 2.目的語と関連している 例:引数の型がObject[]とObjectであるメソッドの動詞はinvokeであることが多い 帰結部がinvokeであるルール381個のうち199個のルールの条件部にObjectという単語が含まれる public Object invoke (Object proxy, Method method, Object[] args) throws Throwable { if (isCorrectMethod(method, args)) { boolean handled = callTarget(args[0]); setApplicationEventHandled(args[0], handled); } // All of the ApplicationListener methods are void; return null regardless of what happens return null; public Object invokeFeature(Map<String, Object> vt, Object subject, String feature, String type, Object[] parameters) { for (ModelInterpreter mi : set) { Object ret = mi.invokeFeature(vt, subject, feature, type, parameters); if (ret != null) { return ret; } return null; 6298/9434 explainに含まれるcreateメソッドを提供する命名相関ルール9434のうち,6298個にObjectが含まれる 例1:createInstance,getCimObjectPathメソッドを呼び出していたらそのメソッドの動詞はcreateになりやすい 例2:containsValueメソッドを呼び出し,booleanを返し,Object型を引数にもつメソッドの動詞はcreateになりやすい (argouml.src.argouml-core-model-mdr).org.argouml.model.mdr //1個目 public ObjectFlowState createObjectFlowState() { ObjectFlowState myObjectFlowState = modelImpl.getUmlPackage(). getActivityGraphs().getObjectFlowState(). createObjectFlowState(); super.initialize(myObjectFlowState); return myObjectFlowState; } (argouml-core-model-mdr.src.)org.argouml.model.mdr.CommonBehaviorFactoryMDRImpl.java; //2個目 public org.omg.uml.behavioralelements.commonbehavior.Object createObject() { org.omg.uml.behavioralelements.commonbehavior.Object myObject = getCbPackage().getObject().createObject(); super.initialize(myObject); return myObject; ArgoUML:org.argouml.util.osdep.OSXAdapter.java ArgoUML:.org.argouml.profile.internal.ocl.CompositeModelInterpreter.java

3:メソッドとその名前にどのような規則があるか 結果(3/4) 3.典型的な処理に関係している 例:next,iterator, hasNext, equalsメソッドを呼び出していればそのメソッドの動詞はfindになりやすい ArgoUML:org.argouml.kernel.ProfileConfiguration.java public Object findStereotypeForObject(String name, Object element) { Iterator iter = null; for (Object model : profileModels) { iter = Model.getFacade().getOwnedElements(model).iterator(); while (iter.hasNext()) { Object stereo = iter.next(); if (!Model.getFacade().isAStereotype(stereo) || !name.equals(Model.getFacade().getName(stereo))) { continue; } if (Model.getExtensionMechanismsHelper().isValidStereotype(element, stereo)) { return stereo; return null; (argouml-app.src)org.argouml.cognitive; /** * Finds a decision with a specific name. * * @param decName the decision name * @return a decision or null if not found. */ protected Decision findDecision(String decName) { for (Decision d : decisions) { if (decName.equals(d.getName())) { return d; } return null; (argouml-app.src)org.argouml.kernel.ProfileConfiguration.java * Find a stereotype with the given name which is applicable to the given * element. * @param name name of stereotype to look for * @param element model element to which the stereotype must be applicable * @return the stereotype or null if none found public Object findStereotypeForObject(String name, Object element) { Iterator iter = null; for (Object model : profileModels) { iter = Model.getFacade().getOwnedElements(model).iterator(); while (iter.hasNext()) { Object stereo = iter.next(); if (!Model.getFacade().isAStereotype(stereo) || !name.equals(Model.getFacade().getName(stereo))) { continue; if (Model.getExtensionMechanismsHelper().isValidStereotype( element, stereo)) { return stereo;

3:メソッドとその名前にどのような規則があるか 結果(4/4) 4.メソッド外の要素に影響を受けている 例:Runnnableインターフェースを実装しているクラスに定義されているメソッドの動詞は,runであることが多い  開発者が命名していない規則 /* * @see java.lang.Runnable#run() */ public void run() {     huntForInternalModules(); LOG.info("Module loading done"); } (argouml-app.src.)org.argouml.application.Main.java; /* * @see java.lang.Runnable#run() */ public void run() { huntForInternalModules(); LOG.info("Module loading done"); } ArgoUML:org.argouml.application.Main.java

目次 オブジェクト指向プログラムにおけるメソッド名の命名の問題点 相関ルールマイニングの利用手法 調査の内容および結果 まとめと今後の課題

まとめ メソッドとその名前に使われる動詞の規則を調査した 命名相関ルールは命名相関ルールの抽出に用いていないソフトウェアのメソッドの60.6%に対して10位以内に適用できた メソッド定義に用いる識別子から動詞を推測できる 代表的な4つの規則を見つけた 意味のあるルールが抽出できていることを示した

今後の課題 応用する 追加調査を行う メソッド名の変更支援 メソッド名の一貫性調査 今回用いた識別子以外の要素との関係 識別子とメソッド名の目的語の関係