Javaプログラムの開発履歴における アクセス修飾子過剰性の分析

Slides:



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

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

Javaプログラムの開発履歴における アクセス修飾子過剰性の分析 井上研究室 博士前期課程2年 石居 達也

背景:アクセス修飾子 アクセス修飾子 フィールド/メソッドへのアクセスを制限する修飾子(※) 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()を呼び,strに文字列を代入 ② getLength()を呼び,strの長さを取得 publicなメソッドgetCorrectLength() public getLength()のアクセス修飾子がprivateではなくpublic 外部から①を飛ばして②を実行可能 NullPointerExceptionの発生

バージョン間における過剰なアクセス修飾子の修正状況について複数のJavaプロジェクトを対象に分析を行う 本研究の概要 高品質なソフトウェアを作成するためには, アクセス修飾子を適切に設定することが望ましい 全フィールド/メソッドに対するアクセス範囲の把握は 現在のソフトウェア開発の現場では困難 Apache Antの1バージョンに多くの過剰なアクセス修飾子を持つフィールド/メソッドが存在することを確認[1] バージョン間における過剰なアクセス修飾子の修正状況について複数のJavaプロジェクトを対象に分析を行う [1] Dotri Quoc, Kazuo Kobori, Norihiro Yoshida, Yoshiki Higo, Katsuro Inoue, ModiChecker: Accessibility Excessiveness, Analysis Tool for Java Program, 日本ソフトウエア科学会大会講演論文集 vol.28, pp.78-83, 2011

既存研究:AE [1] フィールド/メソッドの状態はアクセス修飾子の種類別に以下の表のように分類される 行:現在のアクセス修飾子 列:適切なアクセス修飾子 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以外の状態を2つにグループ化し, 計3つの状態を定義 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) 2つのバージョン間におけるフィールド/メソッドの状態遷移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]を利用 分析1:プロジェクト開発履歴における各状態遷移の出現頻度分析 目的:バージョンアップの際にAEであるアクセス修飾子の修正 がどれ程の頻度で行われているのかを明確にする 計測データ:全バージョン間での(各種状態遷移総数÷全状態遷移総数) 分析2:プロジェクト開発履歴における各AEの修正状況分析 目的:AEの種類ごとに,修正頻度に差異がみられるかどうかを 明確にする 計測データ: 修正されたAE数 ÷ 全バージョン内のAE総数 データの取得にはアクセス修飾子過剰性検出ツールModiChecker[1]を利用

分析概要 (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修正状況(単位:%) 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とも1%に満たない pub-def,pub-pri → 全7プロジェクトにて修正作業が行われている pub-pro,pro-pri → 6プロジェクトにて修正作業が行われている

考察 フィールド/メソッドに共通して得られた知見 フィールドについて得られた知見 メソッドについて得られた知見 一度作成されるとその後アクセス修飾子が変更される ケースは少ない 用途が変わる場合はF/M自体を変更する傾向にある フィールドについて得られた知見 アクセス範囲を明確にして作成されるものが大半 pub-def, pub-pri, pro-def, pro-pri, def-priであるフィールドは比較的修正される傾向にある メソッドについて得られた知見 作成時点ではアクセス範囲が定まっていないものが多い pub-pro, pub-def, pub-pri, pro-priであるメソッドは比較的 修正される傾向にある

まとめ 過剰なアクセス修飾子の修正状況について, 複数の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%