SlideShare une entreprise Scribd logo
1  sur  43
Télécharger pour lire hors ligne
大(中)規模JavaScript開発について



                    @tan-yuki
                    2013/03/16




13年3月7日木曜日
自己紹介


             - Web Application Programmer

             - PHP,Java,JavaScript

             - 日曜プログラマーでRubyとか

             - Github: @tan-yuki




13年3月7日木曜日
自己紹介


                    MyBlog:なら日記
                    http://www.tan-yuki.info/
                    blog/

                    Programmingネタ




13年3月7日木曜日
ならちゃん




13年3月7日木曜日
発表内容




13年3月7日木曜日
1. JavaScriptという言語について

             2. 大(中)規模開発について
              2-1. 困ること
              2-2. 解決策

             3. テストについて




13年3月7日木曜日
1. JavaScriptという言語について




13年3月7日木曜日
長所

       - Browserとtexteditorがあれば誰でもできる

       - 柔らかい言語である(短所でもある)

       - スクリプト言語(面倒なコンパイル作業はない)

       - V8 JavaScriptは言語として実行速度が早い




13年3月7日木曜日
短所①
     - 変数の型なし

                var a = "string value";
                a = 1; // ok


     - Javaに比べると、コーディング規約がしっかりとさ
     だまっていない

             var someVars = “”, some_int = 0;


13年3月7日木曜日
短所②
     - DOM API の使いにくさ (jQueryでカバー)
       document.getElementsByTagName // なげぇ


     - 様々なブラウザで挙動が割りと違う

        var obj = { delete: function() {} }
             // Chrome, FF: ⃝   IE: ☓




     - Microsoft・IEが嫌いになる


13年3月7日木曜日
2. 大(中)規模開発について




13年3月7日木曜日
2-1. 困ること




13年3月7日木曜日
- JavaScriptのソースが多くなってくると
              どこに何があるかよくわからなくなってくる

             - 名前の衝突が起こりやすくなる

             - 何も考えないでコーディングしていると、
              かなりメンテナンスしずらい状態になる




13年3月7日木曜日
// register_user.js

        function getCookie() {
        };

        function setCookie() {
        };

        function getUserInfoFromDOM() {
        };

        function createParamHiddenDOM() {
        };

        function checkSubmitForm() {
        };

        function checkInput() {
        };

        // ....                            ・ページと強依存

                                           ・ひとつの関数を呼びたいがためにこのJSを別ページにロード




13年3月7日木曜日
function request(obj) {
            // .....
        };
                              引数に何渡せばいいんだろう。。。




13年3月7日木曜日
<script src=”./jquery.js”></scirpt>
        <script src=”./prototype.js”></scirpt>
        <script>
        <!--
          $(‘#some-id’).append(‘<h1>Hello world!</h1>’); // error
        -->
        </script>

                                                 奪い奪われるGlobal変数




13年3月7日木曜日
2-2. 解決策




13年3月7日木曜日
WebInspector




             -   Search sources
             -   Break point
             -   Console
             -   etc....



13年3月7日木曜日
OOP (オブジェクト指向開発)




13年3月7日木曜日
var Person = function() {
                 this.init.apply(this, arguments);
             };

             Person.prototype = {
                 // constructor
                 init: function(name, age, male) {
                    this.name = name;
                    this.age = age;
                    this.male = !! male;
                 },
                 greet: function() {
                    return "Hello, I'm " + this.name + ". " +
                           "I'm " + this.age + " years old.";
                 }
             };

             var lisalisa = new Person("LisaLisa", 50, false);
             lisalisa.greet();
             // === "Hello, I'm LisaLisa. I'm 50 years old."




13年3月7日木曜日
// extends
             var Man = function() {
                 this.init.apply(this, arguments);
             };
             Man.prototype = $.extend(true, {}, Person.prototype, {
                 male: true,
                 init: function(name, age) {
                   this.name = name;
                   this.age = age;
                 }
             });

             var caesar = new Man("Caesar", 20);

             caesar.greet();
             // === "Hello, I'm Caesar. I'm 20 years old."

             caesar.male;    // === true




13年3月7日木曜日
Global変数を減らす




13年3月7日木曜日
無名関数を使ってスコープを制限




        (function() {
            var a = "hogehoge";
        })();

        console.log(a); // Reference Error




13年3月7日木曜日
cf) jQueryを使う場合



        (function($) {

             // $ === jQuery;

        })(jQuery);



             ってやると無名関数内の$変数がjQuery
             であることを保証できる。

13年3月7日木曜日
Global変数はProjectに対して一つ


       if (! window.app) var app = {};
       (function($) {
           var SomeController = function() {};

             // implement SomeController....

             app.controller = new SomeController();

       }) (jQuery);




               外出ししたいものは、そのGlobal変数の
               子供として定義


13年3月7日木曜日
例)掲示板アプリ
       // directory structure

       ./bbs
       !"" apiclient.js
       !"" controller.category.js
       !"" controller.post.js
       !"" controller.thread.js
       !"" elem.js
       !"" model.category.js
       !"" model.post.js
       !"" model.thread.js
       !"" router.js
       !"" util.js
       !"" view.category.js
       !"" view.post.js
       #"" view.thread.js

       0 directories, 13 files




13年3月7日木曜日
例)controller.category.js


       if (! window.bbs) bbs = {};
       if (! bbs.controller) bbs.controller = {};

       (function($, __global__) {


             /**
              * Category controller
              *
              * @require bbs.model.category
              * @require bbs.view.category
              */
             var CategoryController = function() {};

             CategoryController.prototype = {
                 // ....
             };

             bbs.controller.category = new CategoryController();

       })(this.jQuery, this);



13年3月7日木曜日
オブジェクト引数




13年3月7日木曜日
受け取り側がこんな感じなら、何を渡すべきかわかりやすい。

             var request = function(options) {
                 options = $.extend(true, {
                     /**
                      * Host name. This is required.
                      *
                      * @type String
                      */
                     host:   null,

                     /**
                      * Port number.
                      *
                      * @type Number
                      */
                     port:   80,   // This is default port number.

                     /**
                      * Parameter send to server.
                      *
                      * @type Object
                      */
                     parameter: {}
                 }, options);

                 // implements request function....


13年3月7日木曜日
3. テスト




13年3月7日木曜日
- 大規模になると手でブラウザを叩いてテスト
             するだけでは限界がある(それも複数のブラウザ)

       - テストケースを書いて自動化することを心がける

       - 単体テストツール
             JSTestDriver, QUnit, Jasmine, ...


       - テストしやすいコード
             => なるべく外部要因に影響されないようなコード


13年3月7日木曜日
QUnit




13年3月7日木曜日
13年3月7日木曜日
こんなかんじです。
             module('Model');

             test("Create model", function() {
                 var Person = Model.create();
                 ok(Person.records, "model has records");

                   var person = Person.init({
                       name: 'tanakayuki',
                       age: 25,
                       male: true
                   });

                   person.save();

                   var p = Person.find(person._id);
                   equal(p.name, 'tanakayuki');
                   equal(p.age, 25);
                   ok(p.male)
             });

             test("Throw exception when record is not found", function() {
                 var Person = Model.create();
                 Person.attributes = ['name', 'age', 'male'];
                 throws(function() {
                     Person.find(1);
                 });
             });

13年3月7日木曜日
非同期テスト

       (function($) {

             test("Async test", function() {
                 expect(1);
                 stop();
                 setTimeout(function() {
                     equal($(‘#navigation’).find(‘li’).length, 4);
                     start();
                 }, 1000);
             });

             test(“ajax test”, function() {
                 expect(2);
                 stop();
                 $.get(‘/user/take/?id=1’, function(data) {
                     equal(data.id, 1);
                     equal(data.name, ‘tanakayuki’);
                     start();
                 });
             });

       }) (jQuery);




13年3月7日木曜日
テストしやすいコード




13年3月7日木曜日
実装



       var init = function(options) {
           options = $.extend(true, {
               now: new Date()
           }, options);


             if (options.now >= new Date(“2014/01/01”)) {
                 // ....
             } else {
                 // ....
             }
       };




13年3月7日木曜日
テスト

             test(function() {
                 init({
                     now: new Date(“2013/12/31”)
                 });
                 // 現在日時が2013/12/31のときのテスト
             });

             test(function() {
                 init({
                     now: new Date(“2014/01/01”)
                 });
                 // 現在日時が2014/01/01のときのテスト
             });




13年3月7日木曜日
実装 その2




             if (! window.app) app = {};

             app.alert = window.alert;
             app.validate = function(name) {
                 if (! name) app.alert('Not set name!');
             };




13年3月7日木曜日
テスト




             test(function() {
                  app.alert = function(msg) {
                      equal(msg, 'Not set name!',
                         'should alert error message');
                };
                app.validate();
             });




13年3月7日木曜日
まとめ




13年3月7日木曜日
- 規模が大きくなることに備えて
              Global変数の仕様は極力おさえましょう。

             - クラス、継承などを用いてOOPな実装
              をしましょう。

             - テストは自動化しましょう。




13年3月7日木曜日
Any questions?




13年3月7日木曜日

Contenu connexe

Tendances

ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和schoowebcampus
 
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013純生 野田
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSONYuka Ezura
 
goog.ui.Component のはぐれかた
goog.ui.Component のはぐれかたgoog.ui.Component のはぐれかた
goog.ui.Component のはぐれかたSoichi Takamura
 
Let's reading OSS's source
Let's reading OSS's sourceLet's reading OSS's source
Let's reading OSS's sourcetemama
 
DOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵までDOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵までMasayuki Nakano
 
introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)Ryuma Tsukano
 
BDD by Jasmine (jscafe 13)
BDD by Jasmine (jscafe 13)BDD by Jasmine (jscafe 13)
BDD by Jasmine (jscafe 13)Ryuma Tsukano
 
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Masataka Motokurumada
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外higaki
 
全脳型アーキテクチュアHandout
全脳型アーキテクチュアHandout全脳型アーキテクチュアHandout
全脳型アーキテクチュアHandoutSeiji Koide
 
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)parrotstudio
 
20130412 titanium meetupvol7
20130412 titanium meetupvol720130412 titanium meetupvol7
20130412 titanium meetupvol7Hiroshi Oyamada
 
公式page改ざんで学ぶjQuery入門 (jscafe7)
公式page改ざんで学ぶjQuery入門 (jscafe7)公式page改ざんで学ぶjQuery入門 (jscafe7)
公式page改ざんで学ぶjQuery入門 (jscafe7)Ryuma Tsukano
 
Reading effective java_3rd
Reading effective java_3rdReading effective java_3rd
Reading effective java_3rd繁史 河久保
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会Yukihiro Kitazawa
 

Tendances (20)

ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
 
MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013MT meets PHP - PHP conference Kansai 2013
MT meets PHP - PHP conference Kansai 2013
 
探検!SwiftyJSON
探検!SwiftyJSON探検!SwiftyJSON
探検!SwiftyJSON
 
goog.ui.Component のはぐれかた
goog.ui.Component のはぐれかたgoog.ui.Component のはぐれかた
goog.ui.Component のはぐれかた
 
Let's reading OSS's source
Let's reading OSS's sourceLet's reading OSS's source
Let's reading OSS's source
 
DOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵までDOMイベントの基礎から深淵まで
DOMイベントの基礎から深淵まで
 
MT meets PHP
MT meets PHPMT meets PHP
MT meets PHP
 
Pb tween
Pb tweenPb tween
Pb tween
 
introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)introduction to Marionette.js (jscafe14)
introduction to Marionette.js (jscafe14)
 
BDD by Jasmine (jscafe 13)
BDD by Jasmine (jscafe 13)BDD by Jasmine (jscafe 13)
BDD by Jasmine (jscafe 13)
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料Unityクリエイターズ勉強会【2/2】【関西】発表資料
Unityクリエイターズ勉強会【2/2】【関西】発表資料
 
OSC京都2011
OSC京都2011OSC京都2011
OSC京都2011
 
Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外Ruby初級者向けレッスン 45回 ─── 例外
Ruby初級者向けレッスン 45回 ─── 例外
 
全脳型アーキテクチュアHandout
全脳型アーキテクチュアHandout全脳型アーキテクチュアHandout
全脳型アーキテクチュアHandout
 
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
これからのJSの話をしよう ~jQueryで作るTwitterアプリ~ (Gunma.web #2 2010/10/9)
 
20130412 titanium meetupvol7
20130412 titanium meetupvol720130412 titanium meetupvol7
20130412 titanium meetupvol7
 
公式page改ざんで学ぶjQuery入門 (jscafe7)
公式page改ざんで学ぶjQuery入門 (jscafe7)公式page改ざんで学ぶjQuery入門 (jscafe7)
公式page改ざんで学ぶjQuery入門 (jscafe7)
 
Reading effective java_3rd
Reading effective java_3rdReading effective java_3rd
Reading effective java_3rd
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会
 

Similaire à 大(中)規模Java script開発について

three.js はじめましょ
three.js はじめましょthree.js はじめましょ
three.js はじめましょHiroaki Okubo
 
Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例Hidetoshi Mori
 
I phoneアプリ入門 第5回
I phoneアプリ入門 第5回I phoneアプリ入門 第5回
I phoneアプリ入門 第5回Sachiko Kajishima
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXShinya Mochida
 
Sencha ug3 siesta_share
Sencha ug3 siesta_shareSencha ug3 siesta_share
Sencha ug3 siesta_share久司 中村
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】株式会社ランチェスター
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験Toshio Ehara
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Nextdynamis
 
Bitter Sweet Javascript
Bitter Sweet JavascriptBitter Sweet Javascript
Bitter Sweet JavascriptDaichi Hiroki
 
スマフォ時代に乗り遅れない為のレスポンシブ・ウェブデザイン
スマフォ時代に乗り遅れない為のレスポンシブ・ウェブデザインスマフォ時代に乗り遅れない為のレスポンシブ・ウェブデザイン
スマフォ時代に乗り遅れない為のレスポンシブ・ウェブデザインinvogue
 
Parse introduction
Parse introductionParse introduction
Parse introductionTamura Koya
 
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説賢次 海老原
 
Implement curry
Implement curryImplement curry
Implement curryGo Tanaka
 
JavaScriptもBACKBONE.JSならスッキリ ~MVCぽいのを初体験!~
JavaScriptもBACKBONE.JSならスッキリ ~MVCぽいのを初体験!~JavaScriptもBACKBONE.JSならスッキリ ~MVCぽいのを初体験!~
JavaScriptもBACKBONE.JSならスッキリ ~MVCぽいのを初体験!~Toshio Ehara
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?Kenji Nakamura
 
WordPressと外部APIとの連携
WordPressと外部APIとの連携WordPressと外部APIとの連携
WordPressと外部APIとの連携Hidekazu Ishikawa
 

Similaire à 大(中)規模Java script開発について (20)

Spockの基礎
Spockの基礎Spockの基礎
Spockの基礎
 
three.js はじめましょ
three.js はじめましょthree.js はじめましょ
three.js はじめましょ
 
Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例Nodejsによるapiサーバ構築事例
Nodejsによるapiサーバ構築事例
 
What's Cuckoo?
What's Cuckoo?What's Cuckoo?
What's Cuckoo?
 
GContractsの基礎
GContractsの基礎GContractsの基礎
GContractsの基礎
 
I phoneアプリ入門 第5回
I phoneアプリ入門 第5回I phoneアプリ入門 第5回
I phoneアプリ入門 第5回
 
Unit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFXUnit testing JavaScript with JUnit/JavaFX
Unit testing JavaScript with JUnit/JavaFX
 
Sencha ug3 siesta_share
Sencha ug3 siesta_shareSencha ug3 siesta_share
Sencha ug3 siesta_share
 
ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】ちょっと詳しくJavaScript 特別編【悪霊の神々】
ちょっと詳しくJavaScript 特別編【悪霊の神々】
 
traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験traceur-compilerで ECMAScript6を体験
traceur-compilerで ECMAScript6を体験
 
Kanazawa.js.Next
Kanazawa.js.NextKanazawa.js.Next
Kanazawa.js.Next
 
Bitter Sweet Javascript
Bitter Sweet JavascriptBitter Sweet Javascript
Bitter Sweet Javascript
 
スマフォ時代に乗り遅れない為のレスポンシブ・ウェブデザイン
スマフォ時代に乗り遅れない為のレスポンシブ・ウェブデザインスマフォ時代に乗り遅れない為のレスポンシブ・ウェブデザイン
スマフォ時代に乗り遅れない為のレスポンシブ・ウェブデザイン
 
Parse introduction
Parse introductionParse introduction
Parse introduction
 
JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説JavaScriptおよびXPages Vote技術解説
JavaScriptおよびXPages Vote技術解説
 
Scala conf2013
Scala conf2013Scala conf2013
Scala conf2013
 
Implement curry
Implement curryImplement curry
Implement curry
 
JavaScriptもBACKBONE.JSならスッキリ ~MVCぽいのを初体験!~
JavaScriptもBACKBONE.JSならスッキリ ~MVCぽいのを初体験!~JavaScriptもBACKBONE.JSならスッキリ ~MVCぽいのを初体験!~
JavaScriptもBACKBONE.JSならスッキリ ~MVCぽいのを初体験!~
 
JavaのGenericsとは?
JavaのGenericsとは?JavaのGenericsとは?
JavaのGenericsとは?
 
WordPressと外部APIとの連携
WordPressと外部APIとの連携WordPressと外部APIとの連携
WordPressと外部APIとの連携
 

大(中)規模Java script開発について

  • 1. 大(中)規模JavaScript開発について @tan-yuki 2013/03/16 13年3月7日木曜日
  • 2. 自己紹介 - Web Application Programmer - PHP,Java,JavaScript - 日曜プログラマーでRubyとか - Github: @tan-yuki 13年3月7日木曜日
  • 3. 自己紹介 MyBlog:なら日記 http://www.tan-yuki.info/ blog/ Programmingネタ 13年3月7日木曜日
  • 6. 1. JavaScriptという言語について 2. 大(中)規模開発について 2-1. 困ること 2-2. 解決策 3. テストについて 13年3月7日木曜日
  • 8. 長所 - Browserとtexteditorがあれば誰でもできる - 柔らかい言語である(短所でもある) - スクリプト言語(面倒なコンパイル作業はない) - V8 JavaScriptは言語として実行速度が早い 13年3月7日木曜日
  • 9. 短所① - 変数の型なし var a = "string value"; a = 1; // ok - Javaに比べると、コーディング規約がしっかりとさ だまっていない var someVars = “”, some_int = 0; 13年3月7日木曜日
  • 10. 短所② - DOM API の使いにくさ (jQueryでカバー) document.getElementsByTagName // なげぇ - 様々なブラウザで挙動が割りと違う var obj = { delete: function() {} } // Chrome, FF: ⃝ IE: ☓ - Microsoft・IEが嫌いになる 13年3月7日木曜日
  • 13. - JavaScriptのソースが多くなってくると どこに何があるかよくわからなくなってくる - 名前の衝突が起こりやすくなる - 何も考えないでコーディングしていると、 かなりメンテナンスしずらい状態になる 13年3月7日木曜日
  • 14. // register_user.js function getCookie() { }; function setCookie() { }; function getUserInfoFromDOM() { }; function createParamHiddenDOM() { }; function checkSubmitForm() { }; function checkInput() { }; // ....  ・ページと強依存  ・ひとつの関数を呼びたいがためにこのJSを別ページにロード 13年3月7日木曜日
  • 15. function request(obj) { // ..... }; 引数に何渡せばいいんだろう。。。 13年3月7日木曜日
  • 16. <script src=”./jquery.js”></scirpt> <script src=”./prototype.js”></scirpt> <script> <!-- $(‘#some-id’).append(‘<h1>Hello world!</h1>’); // error --> </script> 奪い奪われるGlobal変数 13年3月7日木曜日
  • 18. WebInspector - Search sources - Break point - Console - etc.... 13年3月7日木曜日
  • 20. var Person = function() { this.init.apply(this, arguments); }; Person.prototype = { // constructor init: function(name, age, male) { this.name = name; this.age = age; this.male = !! male; }, greet: function() { return "Hello, I'm " + this.name + ". " + "I'm " + this.age + " years old."; } }; var lisalisa = new Person("LisaLisa", 50, false); lisalisa.greet(); // === "Hello, I'm LisaLisa. I'm 50 years old." 13年3月7日木曜日
  • 21. // extends var Man = function() { this.init.apply(this, arguments); }; Man.prototype = $.extend(true, {}, Person.prototype, { male: true, init: function(name, age) { this.name = name; this.age = age; } }); var caesar = new Man("Caesar", 20); caesar.greet(); // === "Hello, I'm Caesar. I'm 20 years old." caesar.male; // === true 13年3月7日木曜日
  • 23. 無名関数を使ってスコープを制限 (function() { var a = "hogehoge"; })(); console.log(a); // Reference Error 13年3月7日木曜日
  • 24. cf) jQueryを使う場合 (function($) { // $ === jQuery; })(jQuery); ってやると無名関数内の$変数がjQuery であることを保証できる。 13年3月7日木曜日
  • 25. Global変数はProjectに対して一つ if (! window.app) var app = {}; (function($) { var SomeController = function() {}; // implement SomeController.... app.controller = new SomeController(); }) (jQuery); 外出ししたいものは、そのGlobal変数の 子供として定義 13年3月7日木曜日
  • 26. 例)掲示板アプリ // directory structure ./bbs !"" apiclient.js !"" controller.category.js !"" controller.post.js !"" controller.thread.js !"" elem.js !"" model.category.js !"" model.post.js !"" model.thread.js !"" router.js !"" util.js !"" view.category.js !"" view.post.js #"" view.thread.js 0 directories, 13 files 13年3月7日木曜日
  • 27. 例)controller.category.js if (! window.bbs) bbs = {}; if (! bbs.controller) bbs.controller = {}; (function($, __global__) { /** * Category controller * * @require bbs.model.category * @require bbs.view.category */ var CategoryController = function() {}; CategoryController.prototype = { // .... }; bbs.controller.category = new CategoryController(); })(this.jQuery, this); 13年3月7日木曜日
  • 29. 受け取り側がこんな感じなら、何を渡すべきかわかりやすい。 var request = function(options) { options = $.extend(true, { /** * Host name. This is required. * * @type String */ host: null, /** * Port number. * * @type Number */ port: 80, // This is default port number. /** * Parameter send to server. * * @type Object */ parameter: {} }, options); // implements request function.... 13年3月7日木曜日
  • 31. - 大規模になると手でブラウザを叩いてテスト するだけでは限界がある(それも複数のブラウザ) - テストケースを書いて自動化することを心がける - 単体テストツール JSTestDriver, QUnit, Jasmine, ... - テストしやすいコード => なるべく外部要因に影響されないようなコード 13年3月7日木曜日
  • 34. こんなかんじです。 module('Model'); test("Create model", function() { var Person = Model.create(); ok(Person.records, "model has records"); var person = Person.init({ name: 'tanakayuki', age: 25, male: true }); person.save(); var p = Person.find(person._id); equal(p.name, 'tanakayuki'); equal(p.age, 25); ok(p.male) }); test("Throw exception when record is not found", function() { var Person = Model.create(); Person.attributes = ['name', 'age', 'male']; throws(function() { Person.find(1); }); }); 13年3月7日木曜日
  • 35. 非同期テスト (function($) { test("Async test", function() { expect(1); stop(); setTimeout(function() { equal($(‘#navigation’).find(‘li’).length, 4); start(); }, 1000); }); test(“ajax test”, function() { expect(2); stop(); $.get(‘/user/take/?id=1’, function(data) { equal(data.id, 1); equal(data.name, ‘tanakayuki’); start(); }); }); }) (jQuery); 13年3月7日木曜日
  • 37. 実装 var init = function(options) { options = $.extend(true, { now: new Date() }, options); if (options.now >= new Date(“2014/01/01”)) { // .... } else { // .... } }; 13年3月7日木曜日
  • 38. テスト test(function() { init({ now: new Date(“2013/12/31”) }); // 現在日時が2013/12/31のときのテスト }); test(function() { init({ now: new Date(“2014/01/01”) }); // 現在日時が2014/01/01のときのテスト }); 13年3月7日木曜日
  • 39. 実装 その2 if (! window.app) app = {}; app.alert = window.alert; app.validate = function(name) { if (! name) app.alert('Not set name!'); }; 13年3月7日木曜日
  • 40. テスト test(function() { app.alert = function(msg) {   equal(msg, 'Not set name!', 'should alert error message');    };    app.validate(); }); 13年3月7日木曜日
  • 42. - 規模が大きくなることに備えて Global変数の仕様は極力おさえましょう。 - クラス、継承などを用いてOOPな実装 をしましょう。 - テストは自動化しましょう。 13年3月7日木曜日