俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

日報 #32 - javascript続報

いやぁちょっと休むとほとんどアクセスなくなりますね。
俄然わくわくしてきますね。

さて、気にせずいきましょう。

今日のテーマは昨日に引き続きjs周りの話。
何度か触れたかもしれませんが、僕はjavascriptについての理解が結構浅いです。
そもそもプロトタイプ型のオブジェクト指向についてほぼ無知と言っていいほど知りません。
どうしてあれが「オブジェクト指向」と呼ばれるのか未だ持って疑問です。
(スコープ周りについてかなり不勉強な俺が悪いんですけどね)

それでもなんとかせにゃならんので、
最低限のルールを最初に決めるわけです。
とはいえ経験もないから、少なくて厳しいルールにしようとした結果、
たった1つに絞られました。

グローバルオブジェクト汚染禁止!ぶら下げていいのは1個だけ!

デバッギングやテストのやりやすさを優先するというより、
「俺がよく分からないから、変なところでwindowむちゃくちゃにしないで!」 「ぶっちゃけそれ以外はよく分からないから、ある程度節度保ってよろしく!でもグローバルオブジェクトだけは以下略」 という切ない願いがこもったルールなわけです。

これが正しいのかどうなのかはさておき、
とにかく僕はこう考えました。
んで、
その1個を決めなきゃいけません。
安心・安全・保守に有利な1個のインスタンスといえば、
シングルトンなわけです。
javascriptでシングルトンを作るために今ググったら、超いい記事ありました。

http://qiita.com/chocolamint/items/f726d4739e94e9eb6314

さすがですキータ先生。
とはいえ、俺は俺で自作したので、それと見比べてみます。

/**
 * HogeApp
 *
 */
(function (window) {
     // 偽物のコンストラクタセット
     window.HOGEAPP= HogeApp;
     function HogeApp() {
          throw new Error('Donot use "new" operator. HogeApp is Singleton!');
     };

    // 本物のコンストラクタ
     var pure_constructor = function()
     {
          console.log('HogeApp construced');
     };
     window.HogeApp = new pure_constructor();

     // ちゃんとPrototypeを継承
     pure_constructor.prototype = HogeApp.prototype;
    
     // いくつかのpublic members
     window.HogeApp.fn={};
     window.HogeApp.data={};
     window.HogeApp.view={};
     window.HogeApp.model={};
     window.HogeApp.collection={};
     window.HogeApp.router={};
     window.HogeApp.events={};
     window.HogeApp.data.isLogin=false;

     // backbone extend
     window.HogeApp.Backbone.Collection=Backbone.Collection.extend({
     });
     window.HogeApp.Backbone.Model=Backbone.Model.extend({
     });
    
     // view.pageInit will be executed in $(document).ready()function
     window.HogeApp.view.pageInit=[];
    
     /**
      * -----------------------------
      * private properties
      * -----------------------------
      */
     var version='1.0';

     /**
      * -----------------------------
      * public properties
      * -----------------------------
      */
     var public_methods={};
}(window));


// Page initializer
$(document).ready(function(){
     _.each(HogeApp.view.pageInit,function(pageInit){
          if(!_.isUndefined(pageInit.onload))
               pageInit.onload();
     });
});

大体似た感じです。
Page initializerみたいなものがないと、onloadの時の処理がやり辛いと思ったので、
それだけ拡張していますが、、、

ここまで見て、「あれ?Backboneは…ぶら下がってね?」と思う方もいらっしゃるでしょう、
そうでしょう、そうなんですからね。
jQueryは?えぇ。
Underscoreは?えぇえぇ。
大事なのは「将来の俺がグローバル汚染しないこと」ですので、
ジョンレシグ先生とかは全然いいんです。
ま、ご参考までにということで。。。