「AspectC++」の版間の差分
編集の要約なし |
|||
5行目: | 5行目: | ||
たとえばあるAPIコールが呼び出されるタイミングを全てトレースしたい場合、コードのあちこちにcerrやprint文を挿入するのではなく、以下のように実装して1つのアスペクトを生成する。 |
たとえばあるAPIコールが呼び出されるタイミングを全てトレースしたい場合、コードのあちこちにcerrやprint文を挿入するのではなく、以下のように実装して1つのアスペクトを生成する。 |
||
< |
<syntaxhighlight lang="cpp"> |
||
aspect Tracer |
aspect Tracer |
||
{ |
{ |
||
13行目: | 13行目: | ||
} |
} |
||
}; |
}; |
||
</syntaxhighlight> |
|||
</source> |
|||
上記のTracerアスペクトは<code>%Iter::Reset</code>が呼ばれる前にメッセージを出力する。<code>%Iter</code>という構文はIterの終わりで全てのクラスにマッチするという意味である。 |
上記のTracerアスペクトは<code>%Iter::Reset</code>が呼ばれる前にメッセージを出力する。<code>%Iter</code>という構文はIterの終わりで全てのクラスにマッチするという意味である。 |
||
19行目: | 19行目: | ||
ソースコード内でマッチした場所をジョインポイントと呼び、アドバイスはそのコードに挿入される。AspectC++はジョインポイントについての情報にアクセスするためのジョインポイントAPIがある。たとえば |
ソースコード内でマッチした場所をジョインポイントと呼び、アドバイスはそのコードに挿入される。AspectC++はジョインポイントについての情報にアクセスするためのジョインポイントAPIがある。たとえば |
||
< |
<syntaxhighlight lang="cpp"> |
||
JoinPoint::signature() |
JoinPoint::signature() |
||
</syntaxhighlight> |
|||
</source> |
|||
という関数は(<code>%Iter::Reset</code>にマッチした)これから呼び出されようとしているメソッド名を返す。 |
という関数は(<code>%Iter::Reset</code>にマッチした)これから呼び出されようとしているメソッド名を返す。 |
2020年7月5日 (日) 23:02時点における最新版
AspectC++(アスペクトシープラスプラス)はC言語及びC++でアスペクト指向プログラミングを実現するための機能拡張。AspectC++のソースコードをC++のソースコードに変換する。GNU GPLライセンスであるが、一部のMicrosoft Windows固有の機能についてはpure-systems社のみが提供している。
アスペクト指向プログラミングは横断的関心事をアスペクト(側面)として1つにモジュール化できる。アスペクトは既存のクラスを修正できるが、一般的には既存の機能の実行前か実行後などで動作する「アドバイス」を提供する。
たとえばあるAPIコールが呼び出されるタイミングを全てトレースしたい場合、コードのあちこちにcerrやprint文を挿入するのではなく、以下のように実装して1つのアスペクトを生成する。
aspect Tracer
{
advice call("% %Iter::Reset(...)") : before()
{
cerr << "次でIter::Resetが呼ばれます " << JoinPoint::signature() << endl;
}
};
上記のTracerアスペクトは%Iter::Reset
が呼ばれる前にメッセージを出力する。%Iter
という構文はIterの終わりで全てのクラスにマッチするという意味である。
ソースコード内でマッチした場所をジョインポイントと呼び、アドバイスはそのコードに挿入される。AspectC++はジョインポイントについての情報にアクセスするためのジョインポイントAPIがある。たとえば
JoinPoint::signature()
という関数は(%Iter::Reset
にマッチした)これから呼び出されようとしているメソッド名を返す。
ジョインポイントAPIはまたアスペクト内で利用できるコンパイル時型情報を持ち、引数の型や値にアクセスしたり、メソッドや関数の戻り値の型や値にアクセスできる。
AspectC++ウェブサイト(下記外部)にドキュメントやチュートリアルがあるほか、AOSDカンファレンス[1]の議事録にはAspect指向プログラミングとAspectC++に関する記事が掲載されている。