第3章 米国政府支援SDP(Software Design and Productivity)研究開発の動向
(1)アスペクト指向
オブジェクト指向は、システムを「もの」、すなわちオブジェクトという側面から分割し、対象システム中の「もの」をモデル化し、その性質(手続きとデータ)を記述する。しかし、対象モデルの性質は、一つの側面ではなく、いくつかの側面を含んでいる場合が多い。このことに着目し、「もの」という側面からではなく、他の側面からもシステムを分割しようとするのがアスペクト指向[8]である。先ず、オブジェクトの側面からシステムを分割し、分割したオブジェクトを横断するような関心事があれば(複数のクラスに同じ関心事があれば)、その関心事に対する機能を一まとめにして分割の単位とする。このように、アスペクト指向とオブジェクト指向とを組み合わせてシステムを構築する。
オブジェクトに跨る関心事には、すべてのオブジェクトに共通な関心事の例として、セキュリティチェック、課金、トレース、ロギング等があり、幾つかのクラス間の取り決めの例として、Observer ― Subjectのようなデザイン・パターンに見られるクラス、図形描画における図形要素と画面の再描画の関係といった構成要素と全体の管理の処理、クラス間の役割を明確化するメソッド呼び出しにおけるプレコンディション・ポストコンディション等がある。また、システム統合を行う場合にもアスペクト指向は有効である。例えば、販売管理システムと配送システムとを統合する場合には、商品の重量、大きさ、配送スケジュール等といった配送の側面から機能を一まとめとにして、販売管理システムに後付けで(販売管理システムに大きな変更を加えずに)追加することもできる。
このようなアスペクト指向をサポートするシステムには、Hyper/J、Aspect/J等がある。Aspect/Jを用いた図形描画における図形要素と画面の再描画の例で、具体的にどのようにコーディングするかを図3.5に示す。
図3.5 Aspect/Jによる図形要素と画面の再描画の例
図3.5の左に示したのが、オブジェクト指向による図形描画のクラスの階層構造である。ここで、図形要素のPoint、Lineが変更されたときには、必ず画面の再描画をしなければならないが、その処理は、各図形要素すべてで記述しなければならなく、モジュラリティがよくない。アスペクト指向では、その部分を別モジュールaspect DisplayUpdatingで記述する。そこでは、pointcut文でPoint、Lineが変更されたという関心事moveを(call(FigureElement.mobeBy||Point.setX||Point.setY||Line.setP1||Line.setP2))で指定し、そのときのオブジェクトをfeと指定する。そして、関心事moveが呼び出された後処理として行うべき処理(画面の再描画)をafter文で指定している。