アクセス修飾子過剰性の変遷に着目したJavaプログラム部品の分析

Slides:



Advertisements
Similar presentations
アルゴリズムとプログラミン グ (Algorithms and Programming) 第6回:クラスとインスタンス クラスの宣言 アクセス修飾子 インスタンスの生成 (new キーワード) this キーワード フィールドとメソッドの実際の定義と使い 方 クラスの宣言 アクセス修飾子 インスタンスの生成.
Advertisements

オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
独習JAVA Chapter 6 6.6 クラスの修飾子 6.7 変数の修飾子 結城 隆. 6.6 クラスの修飾 abstract インスタンス化できないクラス。1つまたは複数のサブクラスで 実装してはじめてインスタンス化できる。 final 継承されたくないことを明示する。これ以上機能拡張 / 変更でき.
シーケンス図の生成のための実行履歴圧縮手法
プログラミング 平成24年1月11日 森田 彦.
XHTML構文検証手法における スクリプト要素の静的解析アルゴリズム
Java プログラムにおける 設計情報を用いた意図的な アクセス修飾子過剰性の抽出手法
Javaプログラムの開発履歴における アクセス修飾子過剰性の分析
アルゴリズムとプログラミング (Algorithms and Programming)
Myoungkyu Song and Eli Tilevich 発表者: 石尾 隆(大阪大学)
情報伝播によるオブジェクト指向プログラム理解支援の提案
第2回:Javaの変数と型の宣言 プログラミングII 2007年10月2日.
テストケースを利用したJavaプログラムのアクセス修飾子過剰性分析手法
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
ソースコードの静的解析による ソフトウェア保守支援に関する研究
川口真司 松下誠 井上克郎 大阪大学大学院情報科学研究科
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
プログラム実行時情報を用いたトランザクションファンクション抽出手法
~手続き指向からオブジェクト指向へ[Ⅱ]~
ソースコードの変更履歴における メトリクス値の変化を用いた ソフトウェアの特性分析
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
ソフトウェア工学 知能情報学部 新田直也.
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
アルゴリズムとプログラミング (Algorithms and Programming)
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
ソードコードの編集に基づいた コードクローンの分類とその分析システム
関数の変更履歴と呼出し関係に基づいた開発履歴理解支援システムの実現
組込みシステムの外部環境分析のためのUMLプロファイル
独習JAVA 6.8 コンストラクタの修飾子 6.9 メソッドの修飾子 6.10 ObjectクラスとClassクラス 11月28日(金)
動的スライスを用いた バグ修正前後の実行系列の比較
暗黙的に型付けされる構造体の Java言語への導入
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
利用関係に基づく類似度を用いたJavaコンポーネント分類ツールの作成
クローンセットに対する主要編集者の分析法の提案と調査
Javaプログラムの変更を支援する 影響波及解析システム
リファクタリング支援のための コードクローンに含まれる識別子の対応関係分析
7.4 intanceof 演算子 7.5~7.9パッケージ 2003/11/28 紺野憲一
ソースコードの特徴量を用いた機械学習による メソッド抽出リファクタリング推薦手法
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
コードクローンの動作を比較するためのコードクローン周辺コードの解析
アスペクト指向言語のための 独立性の高いパッケージシステム
コード片に共通した特性を自動抽出する ソースコード閲覧ツールの試作
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
○ 後藤 祥1,吉田 則裕2 ,井岡 正和1 ,井上 克郎1 1大阪大学 2奈良先端科学技術大学院大学
コードクローンの理解支援を目的としたコードクローン周辺コードの解析
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
C#プログラミング実習 第3回.
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
アスペクト指向言語のための視点に応じた編集を可能にするツール
サブゼミ第7回 実装編① オブジェクト型とキャスト.
オープンソースソフトウェアに対する コーディングパターン分析の適用
開発作業の形式化に基づく プロセス評価 松下誠 大阪大学.
蓄積されたオブジェクトの動作履歴を用いた 実行履歴削減手法の提案
JAVA入門⑥ クラスとインスタンス.
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
動的スライスを用いたバグ修正前後の実行系列の差分検出手法の提案
コードクローン解析に基づく デザインパターン適用候補の検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
メソッド抽出リファクタリングが 行われるメソッドの特徴調査
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

アクセス修飾子過剰性の変遷に着目したJavaプログラム部品の分析 大阪大学大学院情報科学研究科 石居 達也,小堀 一雄,松下 誠,井上 克郎

背景:アクセス修飾子 アクセス修飾子 フィールド/メソッドへのアクセスを制限する修飾子(※) public, protected, default(宣言なし),privateが存在 過剰に設定すると不具合の原因となりうる 過剰:アクセス可能な範囲 > 実際のアクセス範囲 アクセス修飾子 アクセス可能な範囲 public あらゆる部品 protected 自身と同じパッケージに属する部品及び自身のサブクラス default(宣言なし) 自身と同じパッケージに所属する部品 private 自身と同じクラス ※本研究ではクラスのアクセス 修飾子については考慮しない

過剰なアクセス修飾子の宣言による問題の例 文字列strの長さを取得したい public class X { private String str = null; private void setString( ) { // ① str = "hello"; } public int getLength() { // ② return str.length(); public int getCorrectLength() { this.setString(); return this.getLength(); <開発者の想定する正しい手順> ① setString()を呼び,初期値がnullだった変数strにStringオブジェクトを代入 ② getLength()を呼び,strの長さを取得 public getLength()のアクセス修飾子がprivateではなくpublic publicなメソッドgetCorrectLength() 外部から①を飛ばして②を直接実行可能 NullPointerExceptionの発生

本研究の概要 有るべき姿 課題 既存研究 今回の研究アプローチ 高品質なソフトウェアを作成するためには, アクセス修飾子を適切に設定することが望ましい 課題 全フィールド/メソッドに対するアクセス範囲の把握は 現在のソフトウェア開発の現場では困難 既存研究 ソフトウェアのあるバージョンに存在する過剰なアクセス修飾子をもつフィールド/メソッドの分析を行った (例)Apache Antにも多くの過剰なアクセス修飾子を持つフィールド/メソッドが存在することを確認した 今回の研究アプローチ バージョン間における過剰なアクセス修飾子の発生・修正状況について、複数のJavaプロジェクトを対象に分析を行う

既存研究:AE(Accessibility Excessiveness) フィールド/メソッドの状態はアクセス修飾子の種類別に以下の表のように分類される AE(Accessibility Excessiveness) フィールド/メソッドに対して過剰なアクセス修飾子が 宣言されている状態 表の色付きセルが該当 実際のアクセス状況から判断した 適切なアクセス修飾子 Public Protected Default Private NoAccess pub-pub pub-pro pub-def pub-pri pub-na x pro-pro pro-def pro-pri pro-na def-def def-pri def-na pri-pri pri-na 現在宣言している アクセス修飾子

バージョン毎のフィールド/メソッド分類 AE以外の状態を2つにグループ化し, 計3つの状態を定義 ③NA ①AE ②適切 Public 宣言されてはいるが どこからもアクセスされていない ①AE アクセス可能な範囲が 実際のアクセス範囲より広い Public Protected Default Private NoAccess pub-pub pub-pro pub-def pub-pri pub-na x pro-pro pro-def pro-pri pro-na def-def def-pri def-na pri-pri pri-na ②適切 アクセス可能な範囲と 実際のアクセス範囲が一致 AE以外の状態を2つにグループ化し,計3つの状態を定義

バージョン間での状態遷移の分類(1/2) 適切 NA AE なし 2つのバージョン間におけるフィールド/メソッドの状態遷移 扱う状態数は4 適切、AE、NA、なし(フィールド/メソッドが削除される) 扱う状態遷移は6 :18種→6種に単純化する 適切 NA AE なし a,p b c d e,q f g h i,r o l j m k n

バージョン間での状態遷移の分類(2/2) グループ 対応する記号 性質 AE修正 a,b,c アクセス修飾子の変化によりAE修正 適切→適切はアクセス修飾子が変化したもののみ AE発生 d,e,f アクセス修飾子の変化によりAE発生 AE→AEはアクセス修飾子が変化したもののみ アクセス消失 g,h,i アクセス修飾子の変化によりアクセスが消失 NA→NAはアクセス修飾子が変化したもののみ フィールド/メソッド作成 j,k,l バージョンアップにより新たに作成 フィールド/メソッド削除 m,n,o バージョンアップにより削除 変化なし p,q,r バージョンアップ前後で変化がない 適切,AE,NAそれぞれ1状態ずつ

分析概要 (1/2) データの取得にはアクセス修飾子過剰性検出ツールModiCheckerを利用 分析1:プロジェクト開発履歴における各状態遷移の出現頻度分析 目的:バージョンアップの際にAEであるアクセス修飾子の修正 がどれ程の頻度で行われているのかを明確にする 計測データ:全バージョン間での(各種状態遷移総数÷全状態遷移総数) 分析2:プロジェクト開発履歴における各AEの修正状況分析 目的:AEの種類ごとに,修正頻度に差異がみられるかどうかを 明確にする 計測データ: 修正されたAE数 ÷ 全バージョン内のAE総数 データの取得にはアクセス修飾子過剰性検出ツールModiCheckerを利用

分析概要 (2/2) 実験対象:7つのJavaプロジェクト(ある程度バージョン数があり有名なソフトウェア) プロジェクト名 バージョン番号 開発期間(年) Apache Ant 1.1 ~ 1.8.4 23 2003~2012 Areca Backup 5.0 ~ 7.2.17 66 2007~2012 ArgoUML 0.10.1 ~ 0.34 19 2002~2011 FreeMind 0.0.2 ~ 0.9.0 16 2000~2011 JDT_Core 2.0.1 ~ 3.7 2002~2012 jEdit 3.0 ~ 4.5.2 21 2000~2012 Apache Struts 1.0.2 ~ 2.3.7 34

分析1結果-Antにおけるフィールド状態遷移 0.02,71.42 6.41 適切 なし 2.03 0.03 0.46 0.04 0.16 0.21 0.13 1.41 0.02 NA AE 0.00 0.07,15.28 0.00,2.28 0.03

分析1結果-フィールド状態遷移(単位:%) <AE修正,AE発生,アクセス消失> アクセス修飾子の修正を伴う遷移は全体の1%に満たない <フィールド作成> 「適切」で作成される場合が最も多い 変化なし(p,q,r)→全体の約53~97% 変化なし(適切)→全体の約36~71%

分析2結果-フィールドAE修正状況(単位:%) AEが修正される割合はAEの種類に関わらず0.2%に満たない pub-def,pub-pri → 全7プロジェクトにて修正作業が行われている pro-def,pro-pri,def-pri → 6プロジェクトにて修正作業が行われている

分析1結果-メソッド状態遷移(単位:%) <メソッド作成> 比較的「NA」で作成される場合が多い <AE修正,AE発生,アクセス消失> アクセス修飾子の修正を伴う遷移は全体の1%に満たない <メソッド作成> 比較的「NA」で作成される場合が多い 変化なし(p,q,r)→全体の約51~96% 変化なし(NA)→全体の約25~55%

分析2結果-メソッドAE修正状況(単位:%) 注: × ・・・ 全バージョンにて一度も出現しなかったことを表す AEが修正される割合はAEに関わらず高々0.2%に満たない pub-def,pub-pri → 全7プロジェクトにて修正作業が行われている pub-pro,pro-pri → 6プロジェクトにて修正作業が行われている

考察 フィールド/メソッドに共通して得られた知見 フィールドについて得られた知見 メソッドについて得られた知見 一度作成されると、その後アクセス修飾子が変更される ケースは少ない 用途が変わる場合は、フィールド/メソッド自体を変更する傾向にある 多くのソフトウェアで修正されたAE種別が存在する フィールドについて得られた知見 アクセス範囲を明確にして作成されるものが大半 メソッドについて得られた知見 作成時点ではアクセス範囲が定まっていないものが多い

まとめ 過剰なアクセス修飾子の修正状況について, 複数のJavaプロジェクトを対象に分析を行った 分析の結果,以下のことが分かった AEであるフィールド/メソッドのアクセス修飾子に対する 修正作業はほとんど行われない 一部のAEは多くのプロジェクトにおいて修正されている 今後の課題 品質(バグ)とAEの関連性を分析する

既存研究:ModiChecker[1] AEであるフィールド/メソッドの修正支援ツール 主に以下の機能を持つ 本研究では機能を拡張して利用 任意でアクセス修飾子を適切なものへと修正 AEであるフィールド/メソッド情報をCSV形式で出力 本研究ではこの情報を分析に利用 本研究では機能を拡張して利用 AEではないフィールド/メソッド情報も出力 pub-pub,pro-pro,def-def,pri-pri

発表の流れ 用語の説明 ModiChecker AEメトリクス これまで行った実験に関する説明

全メトリクス(フィールド) ant jedit struts jdt_core areca freemind 2003~2012 開発期間 2003~2012 2000~2012 2002~2012 2007~2012 2000~2011 バージョン数 23 21 34 16 59 総フィールド数 6502 4429 9044 8209 2707 2863 b:適切→AEとなる変更 29 44 148 299 50 33 c:AEorNoAccess→適切となる変更 165 106 313 526 43 d:適切orAE→NoAccessとなる変更 45 46 80 142 20 e:NoAccess→NoAccessとなる変更 2 4 3 7 f:AE→AEとなる変更 56 12 70 160 8 15 g:NoAccess→AEとなる変更 1 11 9 h:適切な修飾子で作成 5190 3117 5806 5480 1905 1960 i:AEな修飾子で作成 1144 901 2627 2401 718 619 j:NoAccessな修飾子で作成 168 411 611 328 84 284 k:削除 2121 2600 4210 2245 1254 1052 AE or NoAccessが解消された割合(%) 12.57622 8.07926829 9.66646078 19.27445951 4.11471322 4.76190476

全メトリクス(メソッド) ant jedit struts jdt_core areca freemind 2003~2012 開発期間 2003~2012 2000~2012 2002~2012 2007~2012 2000~2011 バージョン数 23 21 34 16 59 総フィールド数 14503 8464 25248 14375 6381 9573 b:適切→AEとなる変更 85 152 107 303 39 38 c:AEorNoAccess→適切となる変更 494 301 426 1160 237 223 d:適切orAE→NoAccessとなる変更 227 245 158 420 147 110 e:NoAccess→NoAccessとなる変更 12 1 4 24 3 6 f:AE→AEとなる変更 92 278 11 27 g:NoAccess→AEとなる変更 140 356 77 14 13 h:適切な修飾子で作成 4281 3810 5362 5966 2847 3709 i:AEな修飾子で作成 1992 1367 4158 1875 721 632 j:NoAccessな修飾子で作成 8230 3287 15728 6534 2813 5232 k:削除 3280 4788 13160 6662 3943 4752 AE or NoAccessが解消された割合(%) 4.8327138 6.46755479 2.1422106 13.79474373 6.70628183 3.80286494

実験1結果:フィールド Ant Areca Argo UML Free Mind JDT_ Core jEdit Struts AE修正 0.20 0.03 0.50 0.39 0.22 0.30 AE発生 0.11 0.06 0.10 0.56 0.35 0.13 アクセス消失 0.04 0.31 0.23 0.08 F/M作成 8.03 2.07 9.78 32.99 6.11 8.75 8.68 F/M削除 2.62 0.96 7.61 12.12 1.67 5.13 4.03 変化なし 88.98 96.86 81.7 53.59 91.36 85.68 86.68

実験1:メソッド Ant Areca Argo UML Free Mind JDT_ Core jEdit Struts AE修正 0.26 0.10 0.41 0.74 0.48 0.31 0.16 AE発生 0.19 0.03 0.28 0.21 0.20 アクセス消失 0.13 0.05 0.33 0.39 0.24 0.06 F/M作成 7.83 2.48 10.17 31.85 5.97 8.55 9.21 F/M削除 1.77 1.53 6.16 15.81 2.77 4.83 4.8 変化なし 89.82 95.82 82.78 50.94 90.32 85.84 85.57

分析1結果-フィールド状態遷移(単位:%) 「適切」で作成される場合が多い アクセス修飾子の修正頻度は1%に満たない 変化なし(p,q,r)→全体の約53~97% 変化なし(適切)→全体の約36~71%

分析1結果-メソッド状態遷移(単位:%) 比較的「NA」で作成される場合が多い アクセス修飾子の修正頻度は1%に満たない 変化なし(p,q,r)→全体の約51~96% 変化なし(NA)→全体の約25~55%