.NETでアスペクト指向プログラミング(AOP)

ロギング、セキュリティ、トランザクションへの参加といった処理は、複数のクラスに横断的に作用するものである。アスペクト指向とは、これらの横断的に作用するものを分離してモジュール化しようという考え方。横断的に作用する側を共有してユーティリティとしてまとめ、呼び出して利用する従来のプログラミングとは正反対の方法である。

アスペクト指向を.NETで実現するには、属性クラスを使う。
次のサンプルコードは、時間帯によって利用を制限する属性を付加したメソッドである。
起動してボタン1を押すと、GetMessage1が呼び出される。GetMessage1メソッドは現在時刻を返すだけのメソッドであるが、TimeLimit属性が付加されている。また、ボタン2を押すとGetMessage2メソッドが呼び出される。GetMessage2は曜日を返すだけのメソッドであるが、TimeLimit属性が付加されている。

TimeLimit属性は、現在時刻が0から29秒まではGetMessage1およびGetMessage2メソッドを実行するが、30から59秒までなら実行せずに、「現在、この機能は使えません。」というメッセージを表示する。デモなので秒針によって利用を制限しているが、現実世界では時間外(夜間バッチが走る時間帯やメンテナンス中など)は、使えないようにすることを想定している。

注目すべきは、GetMessageメソッドの中に時刻による分岐処理がないということである。時間帯によって利用を制限するというのは運用上の要件であって、システムに求められている機能ではない。この機能をビジネスロジックから分離し、横断的に作用する部分を1箇所(属性クラス)にまとめている。属性クラスに横断的な共通の処理を任せたことで、開発者は業務ロジックに集中できコードも見やすくなる。

さらに、この振る舞いは横断的に変更できる。
時間帯の判断はTimeLimitAttributeクラス一箇所にまとめられているので、このクラスを修正することで、属性が付加されたすべてのメソッドを振る舞いを変更できる。

さらに、良いことは、この属性は付け外しが簡単であることである。メソッドの先頭に1行追加するかしないかだけである。

呼び出し元クラス(C#)

属性が付加されたビジネスロジック(C#)

プロキシクラス(C#)

属性クラス(C#)

呼び出し元クラス(VB.NET)

属性が付加されたビジネスロジッククラス(VB.NET)

プロキシクラス(VB.NET)

属性クラス(VB.NET)

トラックバック

トラックバックURL:
http://www.apricot-jp.com/cgi/mt/mt-tb.cgi/271

関連情報

Copyright(C) 2007 アーキテクト360 Allrights reserved.