JavaScriptでデザインパターン (その9: Revealing module pattern)
今回は、Javascript独自のパターン
ここしばらく他のいろんなことに時間をとられてしまい、なかなかコードを書く時間がとれなかったのですが、久しぶりに時間が空いたので、JavaScriptでデザインパターンシリーズの続き。今回は、Revealing module patternです。
Revealing module patternとは?
これに関してはWikipediaでの記述が見つけきれなかったので、僕の理解のみ。
このパターンは、
・要するにオブジェクト指向でいうカプセル化のこと。
・JavaScriptの思想的にカプセル化はあまり適さないのかもしれないけど、外部から使われる予定のない変数やprivateメソッド的なものを、意図せずglobalに使われないためのパターン。
です。
サンプルコード
今回のものは非常にシンプルなので、一気に書いてしまいます。
var Module = function() { var a = 0; var b = 1; var c = 2; function innerMethodA(){ var result = a + b + c; console.log("innerMethodA: " + result); } function innerMethodB(){ var result = a - b- c; console.log("innerMethodB: " + result); } return { outerMethodA : innerMethodA, outerMethodB : innerMethodB }; }(); console.log(Module.a); //undefined Module.innerMethodA(); // Module.innerMethodA is not a function Module.innerMethodB(); // Module.innerMethodB is not a function Module.outerMethodA(); // innerMethodA: 3 Module.outerMethodB(); // innerMethodB: -3
ここでのキモは、一番下でreturnしているouterMethodAとouterMethodBのみが外部から見えるオブジェクトとなり、その他のinnerMethodやa, b, cといった変数には外部からアクセスできない状態となります。このパターンを取り入れれば、内部だけで使うメソッドや変数を定義できますね。
要するにクロージャを使えばこのパターンになる?
必要なメソッドだけをreturn内部に書くのって、要するにクロージャを使うってことじゃない?と思い、多少調べてみました。その結果は・・・
・クロージャで必要なメソッドだけを外部に使わせるパターンは、Module patternという。
・Revealing module patternは、このModule patternの一種である。
・Privateをどのように(どのような名前で)外部に公開するかは、return内部の一行のみで指定/変更できるのがRevealing module pattern。Module patternだと、オブジェクトの定義本体にも影響が及ぶ。
ということのようです。
以上、 Revealing module patternでした!