プログラミング言語/アスペクト言語

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

アスペクト指向言語[編集]

アスペクト指向言語(Aspect Oriented Programming Language)は、アスペクト指向プログラミングを支援する機構を持ったプログラミング言語です。

アスペクト指向プログラミング[編集]

アスペクト指向プログラミング(Aspect Oriented Programming; AOP)は、オブジェクト指向プログラミング(Object Oriented Programming; OOP)の後続の開発で、OOPの実用上の制限をいくつか解決することを意図して開発されたものである。

オブジェクト指向は、データやメソッドを個別のオブジェクトにカプセル化し、異なるソフトウェア構造間の依存関係を減らし、ポリモーフィズム(特定の目的のために異なるプログラム構造を同一として扱う機能)を用いて、ソフトウェア開発の複雑さを管理することを目的としている。 全体として、互いに明示的な関係を保ちながら適切に構築されたオブジェクト群を定義することで、プログラマーはソフトウェアを「部品化」し、小さくシンプルで集中したスケールで作業を行い、簡単かつ安全に大きな構成要素に組み合わせてより高機能なものを作成することができるようになります。

OOPの現実的な難しさは、どんな大規模なアプリケーションでも、オブジェクトやコンポーネントに簡単に分解できない、あるいはそのように簡単に使用できない側面があることです。 「クロスカットの懸念」とは、大規模なソフトウェアプロジェクトにおいて、複数の場所や複数のオブジェクトに同じように存在する部分のことで、これらの懸念に答えるためのコードを実装すると、カプセル化が事実上崩壊し、依存関係が減少するというよりむしろ増加する。 AOPは、これらのクロスカットを扱うコードを別のプログラミング構成に移し、「織り手」によって自動でOOPソースコードに織り戻すことで、依存関係と複雑さを軽減することを目的としている。 その結果、オブジェクト指向のコードは通常通りコンパイルすることができる。

[編集]

AOPに適した分野の典型的な例として、ロギングが挙げられる。 プログラマはしばしば、開発中のデバッグや配備後のバグ修正のために、プログラムの状態や流れを記録するためにロギングを使用することがある。 OOPプログラムでは、これはいくつかの可能な形をとります。

  • すべてのオブジェクトは、グローバルなロガー・オブジェクトにアクセスでき、そのメソッドを呼び出してイベントや状態を記録します。
  • ロギングを必要とするすべてのオブジェクトは、ログに書き込むために同じコードを繰り返します。
  • 各オブジェクトは、それ自身のログを保持し、場合によってはファイルに保存します。

AOPが解決しようとする本質的な問題は、コードが複数の場所で繰り返されるため、保守が難しく、異なる構造体間の依存関係が増大することです。 ロガーの動作を変更するには、2番目と3番目のケースでは、複数のファイルで同じコードを書き直す必要があり、ロガーの使い方を変更するには、すべてのケースで同じコードを書き直す必要があります。

ロギングをクロスカットで定義し、アスペクトで解決することで、プログラマはロギングを処理するアスペクトコードを書き、「ウィーバー」を使ってOOPソースにコードを注入し、それを通常のOOPコードとしてコンパイルすることができるようになりました。 ロギング機能はクラスのソースコードから取り除かれ、1つの場所にまとめられ、ローカルに定義、実装され、プログラムの残りの部分で個別に使用できる別の単一の構成要素として扱われるようになった。

概要[編集]

理論的には、AOPはSeparation of Concernを実現するための方法である。 オブジェクトはしばしば、概念的に異なる複数の関心事を扱うように要求される。 例えば、売上入力アプリケーションのインボイスは、購入者の身元や購入した品目などの明らかなプロパティを含んでいます。しかし、インボイスオブジェクトは、その動作を記録する方法、データベースで自身を持続する方法、購入者の信用限度を確認する方法、期限を過ぎたときにフラグを立てる方法なども要求されることがあります。 その結果、インボイスクラスは大きく、複雑になり、維持するのが難しくなる可能性がある。 これらの懸念事項は、クラスが扱うべき正当なものですが、OOPの原則によれば、内部で目に見えないように処理されなければなりません。 もし、これらの懸念事項が他のオブジェクトと遠い関係で共有されると、関係するクラスは不必要に複雑になるだけでなく、その複雑さが複数の場所で繰り返されることになります。

いくつかの定義が助けになる。

クロスカット関心事」または「クロスカット」とは、OOPアプリケーションの設計の中で、他に関連性のないいくつかの異なる部分で同時に発生するあらゆる部分のことです。 ログの記録は明らかな例ですが、永続化もその一つです。 銀行アプリケーションでは、多くの異なるオブジェクトを同じ方法で保存し、取り出す必要があります(例えば、リレーショナルデータベース)。 永続化とは、アプリケーションのオブジェクトに対するクロスカットである。

結合点とは、OOPコード内の意味的に定義可能な点で、編み手が識別できるものである。 ロギングの例では、プログラマーはコールスタックを記録したいので、ロガーはすべての関数の入口と出口を記録する必要がある。

一連の結合点は、まとめて「ポイントカット」で識別されます。 ポイントカットは、見つけるべき結合点を定義するAOPコードです。

ポイントカットは、結合ポイントを特定するだけでなく、そのポイントに作用するコードも含んでいます。 このコードはadviceまたはadvicesと呼ばれる。

つまり、aspectとは、AOPモジュールによって処理される特定のクロスカットを定義するポイントカットの集合である。 実際には、ロギングの例に対するソリューションは、プログラマーがロギングを発生させたい結合点を特定するポイントカットを定義するアスペクトモジュールである。 結合点を特定した後、プログラマはAOPモジュールにアドバイスを書き込み、ウィーバーはそのコードをOOPソースコードに注入して、コードのコンパイルの前段階とする。

この時点では、AOPはクラスからユーティリティコードを引き出して一元化する方法に過ぎないように見えますが、これはAOPの長所の1つです。 しかし、AOPはもっと複雑な問題を分離することができます。 請求書の例では、請求書には支払期限があることを述べました。 同様に、私たち自身の支払いにも期限がある場合があります。 この「期限切れ」の懸念は、invoiceとpayableの両方のオブジェクトの構築または初期化に関するポイントカットを定義するアスペクトとしてカプセル化することができる。 これらの結合点では、期限切れメンバを両方のクラスに追加し、期限切れ監視システムに請求書/支払明細を登録し、今後の期限に関する日次レポートを作成するコードを追加することができます。 支払期限を追跡するコードは、単一のモジュールに移動され、invoice/payableオブジェクトの複雑さが減少し、invoice/payableクラスと期限監視システムの間の依存関係がなくなり、システムの保守と変更が容易になりました。

実装[編集]

現在、AOPのプラットフォームとして最も普及しているのは、Java言語の拡張版であるAspectJです。 ここで例に挙げるのは、この言語です。