アスペクト指向プログラミング

横断的関心事: Crosscutting Concern

関心事(Concern)

開発者がひとつのまとまりとして考えるもののことで, 通常はソフトウェアの機能や品質など, 開発者がソフトウェアに作り込む要素を指します. 「ひとつのまとまりとして考える」単位は,開発者の判断に依存します.

たとえば「画面の描画」や「データベースへのアクセス」,「応答性能」など,開発者が名前を付けて取り扱おうとしているものは,それぞれ関心事であるといえます.

関心事は,それぞれが明確に独立しているわけではなく,他の関心事と重複する部分があったり,ある関心事が他の関心事に依存していたりすることもあります.

関心事という言葉については,Gregor Kiczales による AOSD-discuss メーリングリストへの2003年の投稿も参照してください.

Summary:
  concern is a broad term and should be kept as such
  aspect does not mean concern, an aspect is a particular kind of concern

To keep it simple, I say a concern is anything about the software
that I want to be able to think about as a relatively well-defined entity.

http://aosd.net/pipermail/discuss_aosd.net/2003-February/000425.html

「feature」との違い

feature という言葉もソフトウェアが持つ機能のことを指して使われますが, こちらはユーザ(要求仕様)側から見たソフトウェアの機能のことを指し, 開発者視点である「関心事」と区別します.

横断的関心事(Crosscutting Concern)

「相互に関連しあっていて,何か機能変更などがあった場合に 同時に変更されるものは,できるだけ1つのモジュールにまとめておきたい」 という要求がありますが, 何らかの理由でモジュールとしてまとめられない 関心事のことを横断的関心事と呼んでいます. 従来,ソフトウェアの機能に基づいてモジュール分割を行うことが多いため, 性能向上のためのコードや,ログ取得などの付加的な処理は横断的関心事になりやすいといわれています(ソフトウェアファクトリーでは,機能特性に対して運用特性という表現も使われています).

通常のビジネスロジックなど,ベースとなる部分 (既存のモジュール機構でまとめるもの)については "本質" (Core Concern) などと呼び,区別する場合があります. また,研究者によっては,本質的な部分のことをベースレベル, アスペクトの部分をメタレベルと呼ぶ場合があります. 特に,ベースレベルのプログラム部分を指してベースレベルコード,ベースコード などと呼ぶ場合があります.(Fragile Base Code Problemなど)

横断的関心事の分類

Homogeneous vs. Heterogeneous

この区分は,次の論文に登場したものです.

Colyer, A. and Clement, A.: 
Large-Scale AOSD for Middleware. 
Proceedings of the 3rd International Conference on 
Aspect-Oriented Software Development (AOSD 2004), pp.56-65, 
Lancaster, UK, March 2004.
http://doi.acm.org/10.1145/976270.976279

Homogeneous aspect は複数のジョインポイントで同じアドバイスを動かすもの, Heterogeneous aspect は異なるアドバイスを動かすもの,という区別です. プログラムの実行をトレースするアスペクトなど, 同じコードをあちこちにコピーして実現するような処理は Homogeneous に分類されます.

以下の文献では,Homogeneous crosscuts のカプセル化に対するサポートがアスペクト指向の 強みである一方で,アスペクトでは Heterogeneous crosscuts を扱いにくいと述べられています.

Sven Apel, Thomas Leich, Gunter Saake
Aspectual Mixin Layers: Aspects and Features in Concert
Proceeding of the 28th International Conference on Software Engineering
(ICSE 2006), pp.122-131, Shanghai, China, May 2006
http://doi.acm.org/10.1145/1134285.1134304

役割による分類

この分類は,次の書籍で説明されているものです.

Ivan Kiseleve: "Aspect-Oriented Programming with AspectJ", 
Sams Publishing, ISBN 0-672-32410-5
  • Development Aspects
    • プログラムを開発する際,補助的に用いるアスペクトのことです. このアスペクトは,製品出荷時に取り除かれます. これに分類されるアスペクトとして, Logging, Tracing, Profiling がサンプルとして挙げられています. 今のところ,この使い方がもっともよく知られており, 逆にこの使い方しかないのではないか,との声も出ています.
  • Production Aspects
    • プログラムの中の機能を担当するアスペクトです. これに分類されるアスペクトは,システムを正常に機能させるために必要な存在です. セキュリティのチェックや例外処理などがサンプルとして挙げられます.
  • Runtime Aspects
    • 実行時の性能改善を行うアスペクトです. 取り除いてもシステムの機能自体には影響を与えません. バッファリング,オブジェクトのプールやキャッシングなどがこれに当たります.

上記のうち,Development Aspects とRuntime Aspects は, ある程度 Java に慣れたプログラマならば簡単に導入することが可能であるため, 各所で使用されているようです.逆に,用途が限定されるために, 「アスペクト指向はロギングしかできない」との声も聞かれます.

静的 vs. 動的

ジョインポイントとしてソースコードの構造などの静的な情報を用いるものと, プログラムの実行中のイベントのような動的情報を用いるものを, 静的な横断(static crosscutting),動的な横断(dynamic crosscutting) という名前で区分します.

ApsectJ の場合は,インタータイプ宣言を用いた静的な横断に ポイントカット+アドバイスが動的な横断に対応します.

動的な横断静的な横断
AspectJ での仕組みポイントカット+アドバイスインタータイプ宣言
できることメソッド呼び出し位置をまとめるメンバーの宣言をまとめる
できること複数箇所でのメソッド呼び出しをまとめる複数箇所でのメンバー宣言をまとめる
処理内容特定の条件が満たされたらアドバイスを呼び出す特定条件のクラスにメンバーを追加する
処理タイミング実行時判定(コンパイル時に最適化)コンパイル時に処理

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-10-24 (水) 16:39:03 (3925d)