ソースコード縮退による ソースコード理解 神谷年洋 科学技術振興事業団 さきがけ研究21 オブジェクト指向シンポジウム2003.

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

API 呼び出し列の差分を利用した Android アプリケーション比較ツールの 試作 井上研究室 神田 哲也.
Software Engineering Laboratory, Department of Computer Science, Graduate School of Information Science and Technology, Osaka University 保守支援を目的とした コードクローン情報検索ツール.
ソフトウェア工学 知能情報学部 新田直也. オブジェクト指向パラダイムと は  オブジェクト指向言語の発展に伴って形成され てきたソフトウェア開発上の概念.オブジェク ト指向分析,オブジェクト指向設計など,プロ グラミング以外の工程でも用いられる.  ソフトウェアを処理や関数ではなくオブジェク.
シーケンス図の生成のための実行履歴圧縮手法
背景 ソフトウェアの大規模化・複雑化 生産性と品質の向上 ↓ オブジェクト指向分析設計の適用 開発ツールの投入.
情報伝播によるオブジェクト指向プログラム理解支援の提案
リファクタリングのための 変更波及解析を利用した テスト支援ツールの提案
メソッド名とその周辺の識別子の 相関ルールに基づくメソッド名変更支援手法
UML入門 UML PRESS vol.1 より 時松誠治 2003年5月19日.
ソースコードに対する適用可能な修正手順を 可視化するリファクタリング支援手法の提案
プログラム実行履歴を用いたトランザクションファンクション抽出手法
細かい粒度でコードの再利用を可能とするメソッド内メソッドのJava言語への導入
ソフトウェア工学 知能情報学部 新田直也.
コードクローンに含まれるメソッド呼び出しの 変更度合の分析
コードクローンに含まれるメソッド呼び出しの 変更度合の調査
識別子の命名支援を目的とした動詞-目的語関係の辞書構築
細かい粒度で コードの再利用を可能とする メソッド内メソッドと その効率の良い実装方法の提案
ソードコードの編集に基づいた コードクローンの分類とその分析システム
オブジェクト指向 プログラミング 第十三回 知能情報学部 新田直也.
暗黙的に型付けされる構造体の Java言語への導入
コードクローンの分類に基づいた メソッド引き上げ手順の提案とその有効性評価
理学部 情報科学科 指導教官 千葉 滋 助教授 学籍番号 03_03686 内河 綾
オブジェクト指向プログラムにおける エイリアス解析手法の提案と実現
動的スライスを用いたバグ修正前後の実行系列の差分検出手法
ソフトウェアを取り巻く環境の変化がメトリクスに及ぼす影響について
Javaプログラムの変更を支援する 影響波及解析システム
コードクローン検出ツールを用いた ソースコード分析システムの試作と プログラミング演習への適用
UML関係のTIPS 2008年5月26日 2010年5月16日改訂 海谷 治彦.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
コードクローンの動作を比較するためのコードクローン周辺コードの解析
UMLモデルを対象とした リファクタリング候補検出の試み
ソフトウェア制作論 平成30年11月21日.
プログラム理解におけるThin sliceの 統計的調査による有用性評価
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
ソフトウェア保守のための コードクローン情報検索ツール
1-3 UMLの図(ダイアグラム) コンポーネント図 システムの物理的な構成を表現 ソフトウェアコンポーネントの依存性を表現
コードクローン分類の詳細化に基づく 集約パターンの提案と評価
コーディングパターンの あいまい検索の提案と実装
アルゴリズムとプログラミング (Algorithms and Programming)
コードクローン間の依存関係に基づく リファクタリング支援環境の実装
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクトの協調動作を用いた オブジェクト指向プログラム実行履歴分割手法
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第十二回 知能情報学部 新田直也.
統合開発環境によって表現された 言語機構によるコードのモジュール化
同期処理のモジュール化を 可能にする アスペクト指向言語
C#プログラミング実習 第3回.
設計情報の再利用を目的とした UML図の自動推薦ツール
保守請負時を対象とした 労力見積のためのメトリクスの提案
「マイグレーションを支援する分散集合オブジェクト」
プログラムの差分記述を 容易に行うための レイヤー機構付きIDEの提案
サブゼミ第7回 実装編① オブジェクト型とキャスト.
クローン検出ツールを用いた ソフトウェアシステムの類似度調査
オープンソースソフトウェアに対する コーディングパターン分析の適用
状況に応じて適切な 例外処理が行なえる アスペクト指向分散環境実験の 支援ツール
プログラム分散化のための アスペクト指向言語
ソフトウェア理解支援を目的とした 辞書の作成法
JAVA入門⑥ クラスとインスタンス.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
エイリアス関係を考慮した Javaプログラム用静的スライシングツール
ソフトウェア工学 知能情報学部 新田直也.
コードクローン解析に基づく デザインパターン適用候補の検出手法
Javaとは Javaとはオブジェクト指向言語でJava VM(Java仮想マシン)と呼ばれるプログラム上で動作します。
オブジェクト指向言語における セキュリティ解析アルゴリズムの提案と実現
識別子の読解を目的とした名詞辞書の作成方法の一試案
オブジェクト指向メトリクスを用いた 開発支援に関する研究 --- VC++とMFCを用いた開発を対象として ---
プログラム理解のための 付加注釈 DocumentTag の提案
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
Presentation transcript:

ソースコード縮退による ソースコード理解 神谷年洋 科学技術振興事業団 さきがけ研究21 オブジェクト指向シンポジウム2003

背景 ソフトウェアの保守においては、ソースコードを理解することが必要とされる 文書化された仕様、設計を利用する JavaDocなどのコメントによるものも含む ソースコードを分析する 抽象度の高い文書を生成する手法 リバースエンジニアリングツール 意味的なまとまりを抽出する手法 プログラムスライス、Concept Lattice、etc 明示的に記述されない情報を抽出する手法 クロスリファレンス、コンポーネントの分類、エイリアス解析、コードクローン分析, etc オブジェクト指向シンポジウム2003

意味的なまとまりを抽出する手法 プログラム中の要素間の依存関係に基づいて、一部を取り出す プログラムスライス Concept Lattice 影響波及解析 プログラム中の要素間の依存関係に基づいて、一部を取り出す 引用: Paolo Tonella, “Using a Concept Lattice of Decomposition Slices for Program Understanding and Impact Analysis,” IEEE TSE, Vol. 29, No. 6, pp. 495-509, (June 2003) オブジェクト指向シンポジウム2003

問題点 循環した関係が存在すると、一部分を取り出すことが不可能になる 循環した関係の中にある要素の1つが指定されると、その循環に含まれるすべての要素が取り込まれる オブジェクト指向シンポジウム2003

例題:ファイルシステム ユースケース ディレクトリやファイルを作成する・削除する ディレクトリやファイルの名前を変える・移動する ドライブの残り容量を求める … 導き出されるオブジェクト・性質 ファイルシステムはいくつかのドライブを持つ ドライブは特殊なディレクトリであると見なされる ディレクトリはいくつかのノードを持つ ノードはディレクトリかファイルである オブジェクト指向シンポジウム2003

ファイルシステムのクラス図(設計) 依存関係の循環 オブジェクト指向シンポジウム2003

ファイルシステムのクラス図(実装) オブジェクト指向シンポジウム2003

ソースコード縮退とは ソフトウェアを構成する要素(クラスなど)の一部を、副作用を持たない「疑似定数要素」に指定する 副作用=その要素の状態や、その要素と関係を持つ要素の状態、あるいは関係を変化させること クラスを指定した場合 メソッド呼び出しが(戻り値を意味する)定数に置き換わる インスタンス変数が削除される オブジェクト指向シンポジウム2003

ソースコード縮対の効果 要素間の関係の循環を断ち切る ある要素が依存している要素の数が減少する 疑似定数要素、および、疑似定数要素のみに関係をもつ要素を取り除く 要素自体の記述の量が減少する オブジェクト指向シンポジウム2003

例題のソースコード(部分) public abstract class Node { private Directory parent = null; private String name = null; private Drive driveCache = null; …. public Drive getDrive() { if (driveCache != null) { return driveCache; } else { if (this instanceof Drive) { return (Drive)this; return parent.getDrive(); public class File extends Node { private String contents = ""; File() { } public int getSize() { return contents.length(); public void setContents(String contents) { Drive drive = getDrive(); drive.free(this.contents); this.contents = drive.alloc(contents); public String getContents() { return this.contents; オブジェクト指向シンポジウム2003

縮退後のソースコード クラスNodeを 擬似定数要素に指定 public abstract class Node { private Directory parent = null; private String name = null; private Drive driveCache = null; …. public Drive getDrive() { return GET_DRIVE_RETVAL; } public class File extends Node { private String contents = ""; File() { } public int getSize() { return contents.length(); public void setContents(String contents) { Drive drive = Node.GET_DRIVE_RETVAL; drive.free(this.contents); this.contents = drive.alloc(contents); public String getContents() { return this.contents; クラスNodeを 擬似定数要素に指定 オブジェクト指向シンポジウム2003

インクリメンタルなソースコード理解 与えられたソースコードを理解したい それなりに大きい 複雑な依存関係を持っている 1. ソースコード縮退を利用して、依存関係の循環を除去する 2. 他に依存しない少数の要素を抽出してレビューする 3. まだレビューされていない要素から、レビュー済みの要素のみに依存する要素を取り出してレビューする 4. 以下、3を繰り返す オブジェクト指向シンポジウム2003

ケーススタディGemini GUIを用いたソースコード分析ツール Javaで実装され、約1万5千行 クラス115個、パッケージ13個 オブジェクト指向シンポジウム2003

すべてのクラス間の依存関係 見る気が起きない オブジェクト指向シンポジウム2003

Geminiのパッケージ間の依存関係 コントロール 他の ビュー ツールを 起動する モデル ユーティリティ オブジェクト指向シンポジウム2003

パッケージclonedata 楕円はクラス 矩形はパッケージ オブジェクト指向シンポジウム2003

ソースコード縮退適用後 クラスCloneDataを「疑似定数要素」としてソースコード縮体を行う  循環する依存関係に含まれるクラスが9個から4個に減少 依存の方向をさかのぼるようにコードレビューを行うことができる オブジェクト指向シンポジウム2003

学習曲線の比較 9個のクラスを 一気に 4個のクラス オブジェクト指向シンポジウム2003

まとめ 「ソースコード縮退」を提案した 目的 プログラム理解を助ける プログラムから意味的なまとまりを取り出す手法を補助する 効果 依存関係の循環を断ち切る 疑似定数化された要素のソースコードを取り除く ケーススタディとして、コードレビューへ応用した オブジェクト指向シンポジウム2003

課題 応用 ソースコード分析ツールへの応用 IDEへの組み込み 発展 「疑似定数要素」を選択する基準を明確にする 疑似定数要素に置き換えるよりよい方法を考える ソースコード書き換え アスペクト指向技術の利用 テスト・ドリブンの援用 オープン・プロブレム リファクタリングにより依存関係が循環しないように修正できるか? 依存関係が循環しないようなパッケージへの分割はリーズナブルか? オブジェクト指向シンポジウム2003

関連研究:オブジェクト指向プログラムのリバースエンジニアリング 齊藤 寿和※1, 海尻 賢二※1, “オブジェクト指向プログラムのリバースエンジニアリング”, 研究報告 「ソフトウェア工学」 No.136 – 016 ※1 信州大学大学院工学系研究科情報工学専攻 アブストラクト 近年、ソフトウェア開発において、オブジェクト指向開発が注目されている。しかし、オブジェクト指向開発の普及につれて適切なドキュメントを持たないソフトウェアも増えてきている。また、オブジェクト指向言語におけるリバースエンジニアリングでは、実装段階でのクラス構造とリバースエンジニアリングによって実現されるべき分析・設計段階におけるクラス図との抽象度の違いについて考慮する必要がある。本研究では、オブジェクト指向言語としてC++、ドキュメントとしてUMLのクラス図を対象とした。リバースエンジニアリングを行う事によって得られる情報に抽象的な情報を付加することで、より設計に近いクラス図を復元するための手法を提案する。 http://softeng-www.cs.shinshu-u.ac.jp/Thesis/2001/Master/csaito/csaito.ppt オブジェクト指向シンポジウム2003

関連研究2:UMLクラス図からのワークロードの見積もりとスケジュール作成 お手元の予稿集のpp.153-160! 「大規模なシステムを設計した場合にはクラス間の依存関係が複雑になり、クラスの実装やテストの実行順序の決定が困難になる」 オブジェクト指向シンポジウム2003

Lessons Learned Javaソースコードをレビューあるいはリバースエンジニアリングする場合に インスタンス変数は「集約(aggregation)」と「コンポジション(composition)」の両方に用いられることに注意する 自動的に判定することは困難 ソースコードからクラス図を作るツールは適当にごまかしている 名前付けのコーディング規約は重要である メソッド名  副作用 クラス名、インターフェイス名  デザインパターン、ロール パッケージ名  配置 オブジェクト指向シンポジウム2003

パッケージclonedata、クラス図 オブジェクト指向シンポジウム2003

「インスタンスを生成している=コンポジション」と推定 同、集約とコンポジションを推定した場合 「インスタンスを生成している=コンポジション」と推定 オブジェクト指向シンポジウム2003

オブジェクト指向シンポジウム2003