Deprecated :  The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php  on line 456 
Aspect Oriented Programming
 
トップへ戻る
 
アスペクト指向プログラミングについて(2001/06 輪講資料) 
石尾 隆 (t-isio@ics.es.osaka-u.ac.jp)
オブジェクト指向の特徴 
システムをコンポーネントに分解する
  
  非機能的要求などはうまくカプセル化できない
  
   crosscutting concerns
    モジュールの境界を越えて影響する要素
    
     エラーチェック
      同期処理
      ロギング
      パフォーマンス上の考慮
      
    コードが各所に分散し、モジュール性を悪化させる
    
  
アスペクトの導入 
  非機能的な要求を独立して記述
   コンパイル時, 実行時に結合する
   
    Aspect Weaver (Weave: 織り込む)
     結合の基準となる点: Join Points
     
      Join Pointsの例: メソッド呼出, メソッドからのリターン(AspectJ)
       
     
   アスペクトの変更は、コンポーネント側には影響を与えない
   モジュール性、保守性が向上する
  
コンポーネントとアスペクト 
  コンポーネント
   
    一般的オブジェクト指向言語でいうクラスのこと
     システムの機能的分解の単位
     手続きとしてきれいにカプセル化できるもの
     例: GUIの部品、画像フィルタ
     
   アスペクト
   
    新しく導入したモジュール単位
     きれいにカプセル化できない要素
     コンポーネントの意味や性能に影響する
     それだけで自立した記述
     例: メモリアクセスパターン、並列オブジェクトの同期
     
  
記述に用いる言語 
  Component Language
   
    コンポーネントを記述する言語
     従来のオブジェクト指向言語、手続き型言語
     
   Aspect Language
   
    アスペクトを記述する言語
     ドメイン特化言語でもよい
     アスペクトをより自然な形で記述できることが望ましい
     AspectJではJavaの拡張
     
  
ケーススタディ (1) 
ケーススタディ (2) 
  純粋なオブジェクト指向の実装
   
    LOC=1500, 8x8画像でも約100秒, 中間処理画像158250枚
     
   手動での最適化
   
   画像フィルタ処理に対するAspect Weaverによるパフォーマンス向上
   
    アスペクトを定義
     
      メモリ領域の再利用
       中間結果の再利用
       ループの最適化
       
     LOC=4105(weaverのコードを含む), 850ms, 43枚
     
  
Aspect Weaver 
  現時点で公開されているWeaver
   
    AspectJ
     
      Javaを拡張したコンパイラ
       アスペクトを言語要素として定義
       http://aspectj.org/
       
     AspectR
     
      Rubyの拡張モジュール
       アスペクトをAspectクラスのサブクラスとして定義
       http://www.ruby-lang.org/en/raa-list.rhtml?name=AspectR
       
     
  
AOPのメリット 
  crosscutting concernsのモジュール化
   コード量を減らせる
   
    Asepct Weaverを作るほうが、自分で"tangled code"を扱うよりも容易
     
   アスペクトとコンポーネントを独立して再利用できる
   
    そのシステム特有のコードを分離できれば、コンポーネントの再利用が容易になる
     
   Aspectの"plug and play"
  
AOPについて考えられるデメリット,問題点 
  プログラムの動作順序が不透明になる
   
    コンポーネント側のコードからは、どのアスペクトの影響を受けるかわからない
     
      アスペクトは"なくても機能を損なわない"ような自立した記述であるべき?
       
     コードレビューなどが困難になる可能性がある
     アスペクトに含まれたバグが拡散する可能性がある
     
   AspectJにおける問題
   
    aspectの影響を受けるクラスについてはソースコードが必要
       ライブラリのクラスに対してはaspectを付与できない
     
  
その他 
  設計のプロセスがまだ存在しない
   Aspect Weaverの実装、公開、再利用が少ない
   デバッグ手法等が確立されていない
   統合開発環境との連係
   
    アスペクトとコンポーネントの相互関係の取扱
     AspectJ: AJDE for JBuilder, Forte, Emacs
     
  
AOPはどこに使える?  
  アスペクトだけでプログラムが組めないのか?
   
    どのようにアスペクトを結合するかを示すプログラムが必要
     「アスペクト指向」という名がないだけで既にあるアプローチ
     
   高度なAssertion, あるいはプリプロセッサとしての利用
   
    コンポーネント側はアスペクトについて知るべきなのか?
     アスペクトはコンポーネントのカプセル化を破壊してよいのか?
     AspectJではやや機能不足?
     
      たとえばある変数の値の変化に対しての処理を記述したい
       自分でWeaverを作成する手間はどの程度か?
       
      
   オブジェクト指向プログラムが既にある場合
   
    モジュールに分散したプログラムを抽出するために役立つ
     既にあるプログラムを壊さずに、裏で並行動作するプログラムを書ける
     最初からアスペクトを考慮に入れることはできるのか?
     
  
AspectJに付属したサンプルプログラムの例 
  Timeserver
    
    Clientのsetup完了タイミングを"setup" pointcutとして公開
     TimeServiceへの接続処理を"serve"として公開
     Abort, Retry処理をaspectとして定義して"setup", "serve"に接続する
      
  
参考文献 
[AOPatDSL 97] Aspect Oriented Programming, Kiczales,G., Irwin,J., Lamping,J., Loingtier,J.M., Lopes,C.,
Maeda,C., Mendhekar,A., DSL '97 - First ACM SIGPLAN Workshop on Domain-Specific Languages, 1997
[AOP 96] Aspect-Oriented Programming, Gregor Kiczales, John Irwin, John Lamping, Jean-Marc Loingtier,
Cristina Videria Lopes, Chris Maeda, and Anurag Mendhekar, ACM Computing Surveys Vol. 28, No. 4es, 1996