210 likes | 340 Views
第 13 回プログラミングおよびプログラミング言語ワークショップ( PPL2011 ). Kide: 開発環境による オブジェクト指向言語での アスペクト指向開発の支援. 東京工業大学 金澤 圭 堀江 倫大 千葉 滋. プログラミング言語を用いたモジュール化. 言語機構により、ファイル単位に機能を分割 例 . オブジェクト指向 クラス単位、継承. 関心事 A. A 関連の機能. B 関連の機能. int x. char c. int x. char c. int x. bar(..). hoge (..).
E N D
第13回プログラミングおよびプログラミング言語ワークショップ(PPL2011)第13回プログラミングおよびプログラミング言語ワークショップ(PPL2011) Kide: 開発環境による オブジェクト指向言語での アスペクト指向開発の支援 東京工業大学 金澤 圭堀江倫大千葉滋
プログラミング言語を用いたモジュール化 • 言語機構により、ファイル単位に機能を分割 • 例. オブジェクト指向 • クラス単位、継承 関心事A A関連の機能 B関連の機能 intx char c intx char c intx bar(..) hoge(..) bar(..) hoge(..) hoge(..) 入力 同期 入力 同期 入力 ソート ソート 出力 出力 ソート 出力 出力 出力
オブジェクト指向言語を用いたモジュール化の例オブジェクト指向言語を用いたモジュール化の例 • 描画エディタを関心事(機能)ごとにモジュール化 • 見方によってはモジュール化されていない • 横断的関心事 Shape Circle Rectangle Shape Circle Rectangle inty intx intr intw inth setY(y) setRadius(r) setHeight(h) setX(x) setWidth(w) r Log h Log w Log h代入 y代入 r代入 x代入 w代入 描画 描画 描画 描画 描画
アスペクト指向(AOP) • ファイル間をまたがって実装された関心事を アスペクトモジュールに分離できる • AspectJによる図形エディタの実装 Shape Circle Rectangle Logging inty intx intr intw inth r Log w Log h Log setY(y) setRadius(r) setHeight(h) setX(x) setWidth(w) r Log w Log h Log Repainter h代入 y代入 r代入 x代入 w代入 描画 描画 描画 描画 描画 描画
言語機構によるモジュール化の問題点 • 複数の関心事に属すプログラム断片の扱いに困る • AOP は部分的な解である • (言語の習得) Shape Circle Rectangle Logging inty intx intr intw inth r Log w Log h Log setY(y) setRadius(r) setHeight(h) setX(x) setWidth(w) r Log h Log w Log Repainter h代入 y代入 r代入 x代入 w代入 描画 描画 描画 描画 描画 描画
提案: Kide on IDE (統合開発環境) これは setWidth() の説明.. setHeight(h) Readme • 対話的なプログラムのモジュール化を支援 • 対話的な切り替えにより、常に最適な視点で編集可能 • メソッドをグループ化 • ドキュメントのモジュール化 • プログラムと文書とをまたがる擬似的なモジュールも生成可 これは Rectangle クラスの説明.. 描画 .. KideEditor Concern View Circle Rectangle Repainter intr intw inth setRadius(r) setRadius(..) setRadius(r) setHeight(h) setWidth(w) Log setWidth(..) setWidth(w) setRadius(r) setWidth(w) setWidth(w) Log Log これは setWidth() の説明.. setHeight(..) Log Log Log Log r代入 Logging h代入 h代入 r代入 w代入 w代入 r代入 w代入 w代入 setRadius(..) 描画 setWidth(..) 描画 描画 描画 描画 描画 描画 描画
Kideの関心事の定義方法 • GUI を用いて定義する
関心事の一括定義 • 呼び出し関係 • メソッドのオーバーライド関係
定義した関心事の使用方法 • Concern ビューアからKideエディタを起動 • 関心事に対して一括修正 • メソッドの冒頭、(メソッドの最後 / return 文の前)
ドキュメントのモジュール化 • プログラムと文書とをまたがる擬似的なモジュールも生成可能 • Readme のようなチュートリアル、レビューシート
Kideを用いたソフトウェア開発例 プラン • 保守改良時の開発ワークフロー • 課題の報告、検討、修正サイクル • Javassistの開発にKideを用いるなら • メモリ消費量が大きすぎるとの不具合報告 • 情報破棄を実行する prune メソッドを追加 • prune メソッドを実行した後は、クラス定義の変更を許さない クラス定義を変更するメソッドの冒頭にcheckModifyメソッドの追加 • コードレビュー レビュー 設計 開発・ テスト
Kideを用いた開発・テスト プラン レビュー Review 設計 @ pruning 開発・ テスト • 情報破棄を実行する prune メソッドの追加 • pruning という関心事を定義し、一覧表示で確認 JASSIST-28に関する修正は以下の通り .. .. JASSIST-29… CtClassType CtClass Concern View remMethod(..) toBytecode setName(..) pruning addMethod setName setModifiers(..) class file 書込 toBytecode(..) .. prune(..) prune method 追加 name 代入 needCheckModify prune remMethod setModifiers addMethod(..) filed 代入 prune method 除去 set Flag 12
Kideを用いた開発・テスト プラン レビュー Review 設計 開発・ テスト • クラス定義を変更するメソッドの冒頭に checkModifyメソッドの追加 • 関心事needCheckModfyを定義し、checkModifyメソッドを一斉挿入 JASSIST-28に関する修正は以下の通り .. .. JASSIST-29… CtClassType CtClass Concern View remMethod(..) setName(..) pruning addMethod setName setModifiers(..) toBytecode(..) check Modify check Modify .. prune(..) method 追加 name 代入 needCheckModify remMethod setModifiers addMethod(..) check Modify check Modify method 除去 set Flag
Kideを用いたコードレビュー プラン レビュー Review 設計 開発・ テスト • プログラムの断片を利用した報告書の作成 JASSIST-28に関する修正は以下の通り @ review JASSIST-28に関する修正は以下の通り addMethod check Modify method 追加 .. .. remMethod JASSIST-29… CtClassType CtClass Concern View remMethod(..) check Modify setName(..) pruning addMethod setName method 除去 setModifiers(..) toBytecode(..) check Modify check Modify .. prune(..) method 追加 name 代入 needCheckModify remMethod setModifiers prune addMethod(..) check Modify check Modify filed 代入 method 除去 set Flag prune
AOP 言語を使う場合 • ModifyCheckingアスペクトを別のソースファイルに定義 • 閲覧性は向上する • checkModifyメソッドを呼び出している側の可読性は低下 • AOP 言語ではポイントカットを使用し、関心事を定義 • 開発者は AOP 言語特有の文法を覚える必要 • コードが正しい場所に織り込まれているかの確認が困難 • プログラムと文書の両方にまたがる関心事は対応不可
Kideが有用な場合/AOP 言語が有用な場合 • Kide • 保守改良時に用いる際に有用性が高い • AOP 言語 • ソフトウェア開発が始まったばかりの段階で、横断的関心事を捉えられ、アスペクトとして実装することを決定できるのであれば有用性が高い
関連研究: アスペクト指向 • 言語機構によるモジュール化支援 class Shape {.. intx, y; void setX(..) { this.x = x; Screen.repaint(); }.. } class Circle ext. Shape { intr; void setR(..) { this.r = r; Screen.repaint(); } } aspectRepainter { after():execution(void set*(..)) { Screen.repaint(); } } class Rectangle ext. Shape { .. void setWidth(..) {.. Screen.repaint(); } void setHeight(..) {.. Screen.repaint(); } }
関連研究: 開発環境の機構によるモジュール化 • AJDT(+ AspectJ) • 織り込まれるアドバイスを IDE が表示 • AspectJの可読性の問題を解消 • 編集作業はファイル間を行き来する必要がある • Fluid AOP [Hon ら’07] • アスペクト指向の利点を IDE によって生み出す • 3種類の Editable Viewer • AOP の知識が多少必要である
関連研究: 開発環境の機構によるモジュール化 • Code Bubbles • bubble としてプログラム断片を表示、細かい粒度での編集可 • 多くの関心事を定義するための支援がない • AOP の利点を提供することを目的としていない • コードの一括挿入などの機能はない • Colored IDE • エディタ上で Feature ごとに色を付ける • AST に対して Feature を関連付ける • 言語に依存する
関連研究: 開発環境の機構によるモジュール化 • Mylar [Kerstenら ‘05] • タスクごとにモジュール化 • モジュール化の指標は degree-of-interest(DOI) に基づく • DOI が高いものを優先的にビューア上に表示させる • エディタ上に特別な機能はない
まとめと今後の課題 • まとめ • OOP の開発環境で AOP の利点を提供し、プログラムの対話的なモジュール化を支援するKideを提案し、Eclipse プラグインとして実装を行った。 • 一度決めたプログラム分割とは異なる視点からの編集が可能 • 異なる言語間、異なる文書間にまたがる関心事もモジュール化可 • IDE として提供し、特別な知識を習得する必要がない • 今後の課題 • 評価を行う • 一括挿入機能の強化 • UI をより直感的にする