Module パターン - Essential JavaScript And jQuery Design Patterns
人気のある Module パターンを見てみよう。Module パターンは JavaScript 「クラス」のアイディアのためにパブリックとプライベートの両方のカプセル化をおこなうための方法を提供する。実際には関数として定義されている「クラス」を前提にこれらは機能する (簡潔性のために用語をクラスにそろえて説明する)。
このクラスに対して使うと決めたパラメータは実際にはクラスのパラメータである。クラス内部で定義されたローカル変数と関数の両方はプライベートメンバーになる。クラスの retrun メソッド (関数でもある) はパブリックなメソッドと変数を含むオブジェクトを返す。
ちょっとしたトリビアは Module パターンは Douglas Crockford (著書の JavaScript: The Good Parts などで知られる) によってオリジナルかつフォーマルに定義されたということだ。このパターンのバリエーションはこのパターンが定義される前から長いこと使われていそうにもかかわらずだ。別のトリビアは Yahoo の YUI ライブラリをいじったことがあるなら、機能の一部にとても親しみを感じるかもしれない。親しみを感じるのは YUI のコンポーネントが作られるときに Module パターンが強い影響をおよぼしていたからだ。
Singleton パターンが役立つことを見てきた。では、Module パターンがよい選択なのはなぜか?
まず最初に、少なくとも JavaScript の観点から、オブジェクト指向の背景知識をもった開発者にとっては真のカプセル化のアイディアよりもはるかにクリーンである。2番目に、プライベートデータをサポートするからである。Module パターンにおいて、パブリックなコードのパーツはプライベートなパーツにタッチできる一方で、外側の世界からはクラスのプライベートなパーツにタッチできないのである (笑わない!このジョークに関して David Engfer に感謝)。
Module パターンの欠点はパブリックとプライベートメンバーの両方に別々にアクセスすることだ。可視性を変更したいと思うとき、メンバーが使われていたそれぞれの場所で変更をしなければならない。
後でオブジェクトに追加されたメソッドのなかでプライベートメンバーにアクセスすることもできない。すなわち、多くのケースでも Module パターンはとても役に立ち、正しく使われていれば、アプリケーションの構造を改善するポテンシャルが確実にある。
var someModule = (function(){ //プライベートな属性 var privateVar = 5; //プライベートなメソッド var privateMethod = function(){ return 'Private Test'; }; return { //パブリックな属性 publicVar : 10, //パブリックなメソッド publicMethod : function(){ return 'Followed By Public Test '; ), //プライベートメンバーにアクセスしてみる getData : function(){ return privateMethod() + this.publicMethod() + privateVar; } } })(); //このかっこで匿名関数が実行され返される someModule.getData();