この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
JavascriptでAOP
JavaではDIと同時に当たり前になったAOP(アスペクト指向プログラミング)ですが、Javascriptでも行うことができます。 今回紹介するAopJSは、JavascriptでAOPを行うためのライブラリです。 ドキュメントを参考にいろいろとためしてみましょう。
※ちなみに、AopJSは通常のライブラリとしてだけでなく、JQueryのプラグインとしても提供されています。
環境構築方法
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.5
- Node.js : v0.10.8
- npm : 1.2.23
gitリポジトリからAopJSを取得します。
% mkdir aopjs
% cd aopjs
% git clone https://github.com/victorcastroamigo/aopjs.git
次のようにindex.htmlを作成しましょう。次にclient.jsファイルを作成します。client.jsに処理を記述し、AopJSの動作を確認してみます。
<html>
<head>
<script src="aopjs/dist/aop-0.5.3.js"></script>
<script src="client.js"></script>
</head>
<body>
hello aop
</body>
</html>
サンプルプログラム作成
次のようにclient.jsを記述しましょう。対象となるmyFunctionをAOPオブジェクトの関数に渡し、 アドバイスであるmyAdviceをafterアドバイスとして設定します。
//client.js
//ターゲット関数
function myFunction() {
console.log("myFunction");
}
// アドバイス
function myAdvice() {
console.log("myAdvice");
}
// アスペクト
var proxyFunction = AOP.aspect(myFunction).after(myAdvice);
//関数呼び出し
proxyFunction();
呼び出してみると、対象の関数が呼び出された後、アドバイスが実行されていますね。 もちろんafter以外にも、before/afterReturning/afterThrowing等のアドバイスが設定可能です。
//実行結果
myFunction
myAdvice
オブジェクトの関数にアドバイスを適用させることもできます。
var myObject = {
myMethod: function () {
console.log("myObject#myMethod");
}
}
var proxyFunction2 = AOP.aspect(myObject.myMethod, myObject).before(myAdvice);
proxyFunction2();
//myObject.myMethod()とすると、アドバイスは適用されない
オブジェクトのメソッドすべてにアスペクトを適用させるケースです。 AOP.aspectがオブジェクトを受け取る場合、オブジェクトのすべてのメソッドにアドバイスが適用されます。
var myObject2 = {
myMethod2: function () {
console.log("myMethod2");
},
myOtherMethod2: function () {
console.log("myOtherMethod2");
}
}
function myAdvice2() {
console.log("myAdvice2");
}
AOP.aspect(myObject2).after(myAdvice2);
myObject2.myMethod2();
myObject2.myOtherMethod2();
//実行結果
//myMethod2
//myAdvice2
//myOtherMethod2
//myAdvice2
関数実行前に引数にアクセスしたり、実行後返り値にアクセスすることもできます。
//2つの引数を足して結果を返す関数の実行前/実行後にアドバイス適用
var add = AOP.aspect(function (arg1, arg2) {
return arg1 + arg2;})
.before(function (target, args) {
console.log(args[0] + " + " + args[1] + " = ");
})
.after(function (target, args, retval) {
console.log(retval);
});
console.log("returnValue = " + add(2, 3));
//実行結果
//2 + 3 =
//5
//returnValue = 5
まとめ
クライアントサイドも複雑になってきているので、AOPの役立つケースもありそうですね。 簡単に使用できますし、JQueryプラグインとしても使えるので、ぜひ試してみてください。