Delphiでアスペクト指向プログラミングを行うことは可能ですか? サードパーティのソリューションだけでなく、ネイティブ サポートにも興味があります。
AOP で解決したい特定の問題はありませんが、単に AOP の研究に興味があります。
AOP は次の 2 つの要素に依存します。
これは、一般にコード ウィービングと呼ばれます。これは、プログラム変換に関するより大きな研究の専門分野です。
JIT コンパイル言語には、バイトコード/IL により多くの情報が保持されるため、静的にコンパイルされたプログラムよりも多くのコード ウィービングを実装するためのオプションがあります。また、実行時にコードを操作する機能を提供するリフレクションもサポートしています。
Delphi.NET と Prism は、他の .NET 言語と同じようにこれらの機能にアクセスできます。
私が認識している Delphi Win32 用の AOP フレームワークは 2 つあります。1 つ目は、既に述べたMeAOPです。2つ目はインフラです。どちらのプロジェクトも、AOP に対して同様のアプローチをとっています。RTTI と巧妙なポインター操作の組み合わせを使用してメソッド呼び出しをインターセプトするため、メソッド呼び出しの前後に追加のコードを実行できます。フレームワークの AOP クラスのサブクラスとして横断機能を定義します。メソッド名を文字列引数として AOP フレームワークに渡すことにより、インターセプトするメソッドを登録します。
両方のフレームワークは現在も活発に開発されており、実際には AOP よりも範囲が広くなっています。残念ながら、ドキュメントはややまばらです (Infra の場合はほとんどがポルトガル語です)。
別のプロジェクトでは、2004 年にソース コードを編み込んで AOP を試み、ある程度の成功を収めました。基本的に、彼らは DMS と呼ばれる汎用プログラム変換ツールの上にアスペクト ウィーバーを構築し、それを使用して、コンパイル前に Delphi ソース ファイルにコードを挿入しました。彼らのアスペクト指向言語は、主に AspectJ の影響を受けています。
http://www.gray-area.org/Research/GenAWeave/には、元の論文とプレゼンテーション、および変換プロセスのビデオへのリンクがあります。
これを実現するためにランタイム コード インストルメンテーションを使用することもできます。元のソースを変更せずに実行中のコードにカウンターとスタック トレースを挿入するために一部のプロファイラーが使用する手法です。同様の手法を使用して、静的にコンパイルされた実行可能ファイルにクロスカッティング コンサーンを挿入できます。PinToolプロジェクトは、この良い例です。
Delphi の新しいバージョンの ClassHelper では、非常に限られたレベルの AOP タイプの動作が許可されています。ClassHelpers を使用して、他のクラスから派生せずに他のクラスに動作を注入できます。既存のメソッドをオーバーライドし、必要に応じてその既存のメソッドを呼び出すことができます。
制限は、特定のクラスとその子孫に対して ClassHelper を宣言する必要があることです。さらに、クラスは ClassHelper を 1 つだけ持つことができます。
これらは、C# の拡張メソッドに似ています。