型付き/ジェネリックの側面について少し調査しました。アスペクトに関する重要な事実は、忘却です。したがって、側面の懸念はドメインの懸念と直交する必要があります。それにもかかわらず、AspectJ 型を安全にする (StrongAspectJ) / ジェネリックを使用して型ごとの側面を導入するための調査があります。ある論文では、Flyweight パターンの実装が側面として言及されていました。今、一般的な側面のユースケースがもっとあるのではないかと思っていますか?
2 に答える
PostSharp は弱い型付けです。つまり、アドバイスは引数と戻り値を「オブジェクト」として認識します。PostSharp ではジェネリック アスペクトがある程度サポートされていますが (アスペクトはジェネリック クラスにすることもできます)、アドバイスは弱く型付けされているためあまり役に立ちません。
カバーの後ろに、PostSharp によって生成されたグルー コードが強く型付けされていることに注意してください。しかし、アスペクト コードにさらされると、すべてがオブジェクトにダウンキャストされます。
PostSharp の次のバージョンで、ジェネリック引数のサポートにより、強く型付けされたアドバイスを実装することを検討しています。値型をオブジェクトにボックス化すると、かなりのパフォーマンス オーバーヘッドが生じるため、その理由は実行時のパフォーマンスにあります。ジェネリックは、Java と .NET では異なる方法で実装されることに注意してください。そのため、両方のプラットフォームで異なる点を説明する必要がある場合があります。
論文に関して何か助けが必要な場合は、遠慮なく私に連絡してください。
定型文の一部を自動生成して、クラスを RMI 経由で呼び出し可能にすることは、別の使用例です。この例では、一連のメソッドに対していくつかのアラウンド アドバイスを実装しています。
pointcut callsToServer(Type T):
call(public T Server.*(..)) && this(Client)
T around(Type T): callsToServer(T) {
T obj = null;
try {
obj = proceed();
} catch (java.rmi.RemoteException ex) {}
return obj;
}
ジェネリックを使用すると、「メソッド シグネチャが示すのと同じ型のオブジェクトを返す」と言うことができます。もちろん、オブジェクトを返すだけであれば、これは当てはまります。「スロー後」のアドバイスで同様のことができるかもしれませんが、戻り値を操作して RemoteException を null の戻り値に変換することはできません。