まめージェント

Android, GAE, AngularJSの技術ネタ中心。Twitter: @mame01112

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でした!