SlideShare a Scribd company logo
ブラウザサイド MVC 入門




http://www.flickr.com/photos/39943270@N07/6276483269




                                                         Sapporo.js
SaCSS vol.40           - 2012.12.15             佐藤 竜之介(Ryunosuke SATO)
提供
Community for people who like JavaScript.




      Sapporo.js
自己紹介
Sapporo.js




http://sapporojs.org
Sapporo.js - 2012.12.16




Backbone.js handson: @onjiro_mohyahya
     http://connpass.com/event/1368/
Introduction for Browser Side MVC
@tricknotes
/*
 * PR
 * Important!
JavaScript 道場

        超豪華講師
JavaScript コーディング実践
      練習!練習!練習!
 2013.02.23(土)@札幌市産業振興センター
JavaScript 道場

                    on . ..
        超豪華講師
          in g so
  o m m
JavaScript コーディング実践
C     練習!練習!練習!
 2013.02.23(土)@札幌市産業振興センター
*/
よろしく
お願いします
ブラウザサイド MVC 入門




http://www.flickr.com/photos/39943270@N07/6276483269




                                                         Sapporo.js
SaCSS vol.40           - 2012.12.15             佐藤 竜之介(Ryunosuke SATO)
本発表について
【開発編】ブラウザサイド MVC 入門(佐藤竜之介)

画面遷移を行わず、1枚の html 上で対話的に操作するような web アプリケーションを目にする機会が増えてきまし
た。
そんなアプリケーションを開発する際、jQuery 主体だったこれまでの開発スタイルだと画面表示と機能が切り離せなく
なってしまい、変更に弱い作りになってしまうことになるでしょう。

この問題に対処するにはどうすればよいでしょう?

そんなときは先人の知恵を参考に、その解決策を探してみるのはいかがでしょうか。
ユーザからのインタラクションを受け付けるアプリケーションを上手く構築していく際のやり方として、MVC パターン
が広く知られています。

本セッションでは、ブラウザ上での JavaScript の MVC の原点を辿り、その実装のひとつである Backbone.js を例に
とって、整理されたコードについて考えてみたいと思います。



【        編】     を利用した開発環境パワーアップ講座(やまがあつ)




      http://www.sacss.net/special03/
はじめに
ちょっと考えてみましょう
お題
「やることリストを作ってください」

* タスクを登録できること
* 完了したタスクをチェックできること
* タスクを消すことができること
Sample
http://tasklist-demo.herokuapp.com/
?
            ?
どんなアプローチをとりますか
例えば...
  jQuery だけ使って、
ひとつひとつ作っていった場合
Introduction for Browser Side MVC
* enter が押されると...
 * テキストを取得してやることを追加する
 * 全件数をひとつ増やす
Introduction for Browser Side MVC
* checkbox が変化すると...
 * やることに取り消し線を引く
 * 完了件数を増やす
Introduction for Browser Side MVC
* 削除ボタンを押すと...
 * やることを削除する
 * 件数をひとつ減らす
* enter が押されると...
                        * テキストを取得してやることを追加する
                        * 全件数をひとつ増やす




* checkbox が変化すると...
 * やることに取り消し線を引く       * 削除ボタンを押すと...

 * 完了件数を増やす             * やることを削除する
                        * 件数をひとつ減らす
* enter が押されると...
                        * テキストを取得してやることを追加する
                        * 全件数をひとつ増やす




* checkbox が変化すると...
 * やることに取り消し線を引く       * 削除ボタンを押すと...

 * 完了件数を増やす             * やることを削除する
                        * 件数をひとつ減らす
「ところでさ、
  終わったタスクを
まとめて削除したいんだ
    けど...」
http://commonpost.boo.jp/?attachment_id=21729




                                      えっ
Introduction for Browser Side MVC
* まとめて削除ボタンを押すと...
 * チェックがついているタスクを探す
 * チェックがついているタスクを削除する
 * 全件数を更新する
 * 完了件数を更新する
* enter が押されると...
 * まとめて削除ボタンを押すと...        * テキストを取得してやることを追加する
   * チェックがついているタスクを探す      * 全件数をひとつ増やす
   * チェックがついているタスクを削除する
   * 全件数を更新する
   * 完了件数を更新する




* checkbox が変化すると...
 * やることに取り消し線を引く          * 削除ボタンを押すと...

 * 完了件数を増やす                * やることを削除する
                           * 件数をひとつ減らす
* enter が押されると...
 * まとめて削除ボタンを押すと...        * テキストを取得してやることを追加する
   * チェックがついているタスクを探す      * 全件数をひとつ増やす
   * チェックがついているタスクを削除する
   * 全件数を更新する
   * 完了件数を更新する




* checkbox が変化すると...
 * やることに取り消し線を引く          * 削除ボタンを押すと...

 * 完了件数を増やす                * やることを削除する
                           * 件数をひとつ減らす
http://livedoor.3.blogimg.jp/hamusoku/imgs/b/a/ba9d0808.jpg




                                  複雑
これについてはまた後で :-)
今日のお品書き
* MVC の背景
* MVC って何?
* ブラウザの中でのMVC
* MVC の背景
* MVC って何?
* ブラウザの中でのMVC
最初の例

  ひとつひとつ作って、
だいぶ複雑になってしまっていた
http://www.flickr.com/photos/pappuradonkarume/4711288623




変更が困難
?
             ?
この複雑さの原因は何でしょう
* enter が押されると...
                        * テキストを取得してやることを追加する
                        * 全件数をひとつ増やす




* checkbox が変化すると...
 * やることに取り消し線を引く       * 削除ボタンを押すと...

 * 完了件数を増やす             * やることを削除する
                        * 件数をひとつ減らす
入力フォーム   リスト表示


完了チェック   取り消し線


削除ボタン    件数表示
入力フォーム    リスト表示


完了チェック    取り消し線


削除ボタン     件数表示



全部削除ボタン
入力フォーム    リスト表示


完了チェック    取り消し線


削除ボタン     件数表示



全部削除ボタン
矢印が多い
それぞれのイベントハンドラの中で、
   関係のある表示部分を
    すべて更新している
機能 と 表示 が一緒になっているので、
ひとつの変更でもあっちもこっちも直す必要がある



 他にも、 html のマークアップの変更や、
     DOM 構造の変更も困難...
整
どうやって

  理
 する?
何を
管理したいんだっけ?
「やることリストを作ってください」

* タスクを登録できること
* 完了したタスクをチェックできること
* タスクを消すことができること
やることリスト
入力フォーム             リスト表示


完了チェック             取り消し線
         やることリスト

削除ボタン              件数表示
ユーザが
         入力した!           更新する


入力フォーム
           ひとつ増やす
                                リスト表示
            増えたよ!




完了チェック                          取り消し線
         やることリスト

削除ボタン
                 増えたよ!
                                件数表示
                   更新する
本質的な
 部分
 を抽出する
解決するための、先人の知恵


上手く整理するためのコツ
One of the architecture pattern




MVC
(様々な形で実装されながら、今日に至る)
* MVC の背景
* MVC って何?
* ブラウザの中でのMVC
ソフトウェアアーキテクチャ
 ソフトウェア開発のためのパターン体系
          http://www.amazon.co.jp/dp/4764902834
アプリケーションを柔軟に保つための


先人の知恵
ちょっと具体的に見てみましょう
1. 前提
2. 課題
3. 解決方法
1. 前提


‘
‘
人間とコンピュータが対話するとい
う機能を備えたソフトウェアを開発
する際にこのパターンを考慮する


          - ソフトウェアアーキテクチャ -
1. 前提
 一枚の html の中で
一部だけ更新するような、
画面の切り替わりがない
アプリケーションが対象
2. 課題


‘
‘
ユーザインターフェースの
  変更は頻繁である

        - ソフトウェアアーキテクチャ -
2. 課題
✓ ここのとこ、ちょっと見た目を変えて欲しいんだけど...
✓ こんな機能ほしいんだけど...
✓ ブラウザの進化によって、コードを変えないといけない


   これらが容易に起こる
        &
  対応しなくてはいけない!!
!!
ユーザインターフェースは


寿命が短い!
2. 課題
これに対して、本質的な機能は
   変更頻度が低い

やることリストを管理したい
3. 解決方法

‘
‘課題を解決するために、
 対話型アプリケーションは
処理、入力、出力の3つの部分に
  分割されるべきである

         - ソフトウェアアーキテクチャ -
3. 解決方法
機能とユーザインターフェースが
    くっついていると
   変更が大規模になる

分けましょう!
入力フォーム             リスト表示


完了チェック             取り消し線
         やることリスト

削除ボタン              件数表示
入力フォーム             リスト表示


完了チェック             取り消し線
         やることリスト

削除ボタン              件数表示




  入力       処理       出力
3. 解決方法

データと処理: Model
ユーザ入力:   Controller
表示形式:    View
Model
View
Controller
入力フォーム                 リスト表示


完了チェック                 取り消し線
             やることリスト

削除ボタン                  件数表示



Controller    Model     View
入力フォーム                 リスト表示


完了チェック                 取り消し線
             やることリスト

削除ボタン                  件数表示



Controller    Model     View
入力・出力・処理を分ける

                          イベント


Controller             View
イベントを受け付ける           表示の仕方




             Model
              データと処理
実際にどうやって分け
ていけばいいかは
  この後で
http://blog.shinetech.com/2011/07/25/cascading-select-boxes-with-backbone-js/




                                   break
ここまでの内容
  http://blog.shinetech.com/2011/07/25/cascading-select-boxes-with-backbone-js/




* MVC の背景
✓ 画面の変更がしづらいことってありませんか?
* MVC って何?
✓ アプリケーションを柔軟に保つための先人の知恵
✓ 変化に対応するため、処理、入力、出力に分ける
* ブラウザの中での MVC
* MVC の背景
* MVC って何?
* ブラウザの中でのMVC
実際のコードでは
どう実現すればよいのか
            ?
            ?
多くの
フレームワーク
Helping you select an MV* framework
 Download (1.0.1)       View project on GitHub




Introduction                                    Our Stable Apps
Developers these days are spoiled with choice   Backbone.js                   R

when it comes to selecting an MV*
framework for structuring and organizing        Ember.js              R


their JavaScript web apps.
                                                AngularJS                 R

Backbone, Ember, AngularJS, Spine... the list
of new and stable solutions continues to        Spine         R

grow, but just how do you decide on which to
use in a sea of so many options?                KnockoutJS                    R



To help solve this problem, we created          Dojo      R

TodoMVC - a project which offers the same

http://addyosmani.github.com/todomvc/
Todo application implemented using MV*
concepts in most of the popular JavaScript
MV* frameworks of today.
                                                YUI   R



                                                Batman.js                 R



   Tweet   667
                                                Closure           R
今回は
http://backbonejs.org
今回は Backbone.js を
例に挙げて見てみましょう
 ✓ 広く使われている
 ✓ 仕組みが比較的シンプル
イベント


Controller             View
イベントを受け付ける           表示の仕方




             Model
              データと処理
Backbone.js のアプローチ
                   イベント


               DOM
      表示の仕方
  イベントを受け付ける    View




      Model
       データと処理
実際には複数あるので...
                      イベント


                 DOM
     表示の仕方
 イベントを受け付ける        View

                      View

 Model
                          View
         Model
          データと処理
やることリストの例を考える
createTaskView


TaskView

                     TotalView
createTaskView
                        TaskView


                 Task


             TaskList
                        TotalView
createTaskView
                        TaskView


                 Task


             TaskList

タスクを作成する                TotalView
ユーザが
            入力した!

                                   作成する

createTaskView
                  ひとつ増やす
                            TaskView

   追加する
                            増えた!
                 Task

                           増えた!
                                   更新する
             TaskList
                            TotalView
createTaskView
                        TaskView


                 Task


             TaskList

タスクを完了する                TotalView
更新する
                                          ユーザが
                                         チェックした!
createTaskView
                   変わった!          TaskView

                                  変更する

                 Task
                             変わった!


                                           更新する
             TaskList
                 変わった!            TotalView
createTaskView
                        TaskView


                 Task


             TaskList

タスクを削除する                TotalView
削除する     ユーザが削除ボタ
                                       ン押した!

createTaskView
                  削除された!        TaskView

                                削除する

                 Task
                           削除された!


                                         更新する
             TaskList
                 変わった!          TotalView
整理
createTaskView
                        TaskView


                 Task


             TaskList
                        TotalView
createTaskView
                        TaskView


                 Task


             TaskList

タスクを削除する
doneDeleteView
                        TotalView
削除する

createTaskView
                      削除された!
                                 TaskView


           削除する
                   Task
   完了タスク
   を削除する
                               更新された!
                                          更新する
ユーザが削除ボタ
 ン押した!
                  TaskList
                                 TotalView
doneDeleteView
機能を増やしても
不自然な矢印は増えない
動いているコード
  を見てみる
createTaskView
                        TaskView


                 Task


             TaskList
                        TotalView
ユーザが
            入力した!

                                   作成する

createTaskView
                  ひとつ増やす
                            TaskView

   追加する
                            増えた!
                 Task
タスクを作成する                   増えた!
                                   更新する
             TaskList
                            TotalView
ユーザが
            入力した!

                                   作成する

createTaskView
                  ひとつ増やす
                            TaskView

   追加する
                            増えた!
                 Task

                           増えた!
                                   更新する
             TaskList
                            TotalView
var Task = Backbone.Model.extend({
  defaults: {
    done: false
  },

 initialize: function(attrs) {
   var id = attrs && attrs.id
     || ('task-' + Number(new Date()));
   this.set('id', id);
 },

  destroy: function() {
    this.trigger('destroy', this);
    this.off();
  }
          var TaskList = Backbone.Collection.extend({
});
            model: Task,

            initialize: function() {
              this.on('destroy', this.remove, this);
            }
ユーザが
            入力した!

                                   作成する

createTaskView
                  ひとつ増やす
                            TaskView

   追加する
                            増えた!
                 Task

                           増えた!
                                   更新する
             TaskList
                            TotalView
var CreateTaskView = Backbone.View.extend({
  events: {
    'submit form': 'onSubmit'
  },

 onSubmit: function() {
   var $text = this.$el.find('#text'),
       text = $text.val();
   if (!text) { return false; }

    this.createTask(text);
     $text.val('');
    return false;
  },

  createTask: function(text) {
    this.collection.add({text: text});
  }
});
ユーザが
            入力した!

                                   作成する

createTaskView
                  ひとつ増やす
                            TaskView

   追加する
                            増えた!
                 Task

                           増えた!
                                   更新する
             TaskList
                            TotalView
var taskList = new TaskList();

// setup task list
taskList.on('add', function(task) {
  var taskView = new TaskView({model: task});
  taskView.render();
  taskView.$el.appendTo('#taskList');
});

// setup add task form
var createTaskView = new CreateTaskView({
  el: '#createForm',
  collection: taskList
});
demo: http://tasklist-demo.herokuapp.com/
github: https://github.com/tricknotes/task-list
その他の
Backbone.js の機能
ブラウザサイド MVC での
   難しいところ
✓ URL
✓ サーバとのデータ同期
✓ 更新の反映のタイミング
従来の MVC とは別の
解決が必要な部分がある
Backbone.js のアプローチ
                   イベント


               DOM
      表示の仕方
  イベントを受け付ける    View




      Model
       データと処理
URL                      イベント

                           DOM

Router
                           View
                            View
History


            Model

           Collection


          サーバ       Sync
http://backbonejs.org
まずは使ってみる




http://www.flickr.com/photos/hidekazufuruki/6881051786/sizes/h/in/photostream/
今日のまとめ
* MVC の背景
✓ 画面の変更がしづらいことってありませんか?
* MVC って何?
✓ アプリケーションを柔軟に保つための先人の知恵
✓ 変化に対応するため、処理、入力、出力に分ける
* ブラウザの中での MVC
✓ Backbone.js のアプローチについて
tricknotes
  .talk
  .trigger(‘end’);
more information...
Backbone.js の参考情報




http://www.adventar.org/calendars/15
https://github.com/enja-oss/Backbone
Helping you select an MV* framework
 Download (1.0.1)       View project on GitHub




Introduction                                    Our Stable Apps
Developers these days are spoiled with choice   Backbone.js                   R

when it comes to selecting an MV*
framework for structuring and organizing        Ember.js              R


their JavaScript web apps.
                                                AngularJS                 R

Backbone, Ember, AngularJS, Spine... the list
of new and stable solutions continues to        Spine         R

grow, but just how do you decide on which to
use in a sea of so many options?                KnockoutJS                    R



To help solve this problem, we created          Dojo      R

TodoMVC - a project which offers the same

http://addyosmani.github.com/todomvc/
Todo application implemented using MV*
concepts in most of the popular JavaScript
MV* frameworks of today.
                                                YUI   R



                                                Batman.js                 R



   Tweet   667
                                                Closure           R
http://www.publickey1.jp/blog/12/javascriptmvc.html
https://gist.github.com/1362110
  Original: http://blog.nodejitsu.com/scaling-isomorphic-javascript-code
本日は
概論まで
実践
あるのみ
Sapporo.js - 2012.12.16




Backbone.js handson: @onjiro_mohyahya
     http://connpass.com/event/1368/
JavaScript 道場

        超豪華講師
JavaScript コーディング実践
      練習!練習!練習!
 2013.02.23(土)@札幌市産業振興センター
ここまではまだまだ概論なので、
しっかりと実践して、その中から
新しい学びを一緒に見つけて行き
                ましょう!
  http://www.flickr.com/photos/8674051@N04/6380167887/

More Related Content

PDF
React Redux Redux-Saga + サーバサイドレンダリング
PDF
翻訳から始めるVue.js 入門
PDF
RailsでReact.jsを動かしてみた話
PDF
Bp study39 nodejs
PDF
AsyncTask アンチパターン
PPTX
OpenGLプログラミング
PDF
大規模Node.jsを支える ロードバランスとオートスケールの独自実装
PDF
はじめてのVue.js
React Redux Redux-Saga + サーバサイドレンダリング
翻訳から始めるVue.js 入門
RailsでReact.jsを動かしてみた話
Bp study39 nodejs
AsyncTask アンチパターン
OpenGLプログラミング
大規模Node.jsを支える ロードバランスとオートスケールの独自実装
はじめてのVue.js

What's hot (20)

PDF
覚醒!JavaScript
PDF
Gradleどうでしょう
PDF
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
PDF
Node.js を選ぶとき 選ばないとき
PDF
はじめる Ember.js!! ~ Getting started with ember.js ~
PDF
Node.js入門
PDF
なぜ人は必死でjQueryを捨てようとしているのか
PDF
Griffon10 in groovy_fx
PDF
Vue.js with Go
PPTX
Sails.jsのメリット・デメリット
PDF
モダンJavaScript環境構築一歩目
PDF
svelte と tailwind で始めるフロントエンド開発
PDF
むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8
PDF
TypeScriptへの入口
PPTX
kichijyojipm17-Riot20190301
PDF
About SnapKit - Open source lab -
PDF
JavaScript基礎勉強会
PDF
JasmineによるJavascriptテスト駆動開発
PDF
コンパイラ指向ReVIEW
PDF
はじめてのWallaby.js
覚醒!JavaScript
Gradleどうでしょう
もっとはじめる Ember.js !! ~ Getting started with Ember.js more ~
Node.js を選ぶとき 選ばないとき
はじめる Ember.js!! ~ Getting started with ember.js ~
Node.js入門
なぜ人は必死でjQueryを捨てようとしているのか
Griffon10 in groovy_fx
Vue.js with Go
Sails.jsのメリット・デメリット
モダンJavaScript環境構築一歩目
svelte と tailwind で始めるフロントエンド開発
むずかしくないJavaScriptのやさしい話 jQueryからの次のステップ #ndsmeetup8
TypeScriptへの入口
kichijyojipm17-Riot20190301
About SnapKit - Open source lab -
JavaScript基礎勉強会
JasmineによるJavascriptテスト駆動開発
コンパイラ指向ReVIEW
はじめてのWallaby.js
Ad

Similar to Introduction for Browser Side MVC (20)

PDF
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
PPTX
MVVM入門
PDF
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
PPT
20090212
PPT
20130924 Picomon CRH勉強会
PDF
GUIのアーキテクチャ
PDF
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
PDF
Mvcのすすめ
PDF
Asp Net Mvc 基礎のキソ
PDF
ASP.NET MVC 2 ~新機能の紹介~
PDF
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
PDF
MVCフレームワークと戦った話
PDF
最新 ASP.NET Web 開発オーバービュー
PPTX
Visual Studio による開発環境・プログラミングの進化
PDF
Mvc conf session_1_osada
PPT
やってみよう!ASP.NET MVC #2
PDF
React.js + Flux入門 #scripty02
PPTX
20110607
PDF
Mvc conf session_4_ono
PDF
jQuery と MVC で実践する標準志向 Web 開発
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
MVVM入門
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
20090212
20130924 Picomon CRH勉強会
GUIのアーキテクチャ
XAML と C# を使った Windows ストアアプリ(LOB)構築のためのtips Prism 4.5 & Kona project 等のご紹介
Mvcのすすめ
Asp Net Mvc 基礎のキソ
ASP.NET MVC 2 ~新機能の紹介~
[公開用]Netラボ2012年2月勉強会 asp.netmvc4 beta新機能の紹介
MVCフレームワークと戦った話
最新 ASP.NET Web 開発オーバービュー
Visual Studio による開発環境・プログラミングの進化
Mvc conf session_1_osada
やってみよう!ASP.NET MVC #2
React.js + Flux入門 #scripty02
20110607
Mvc conf session_4_ono
jQuery と MVC で実践する標準志向 Web 開発
Ad

More from Ryunosuke SATO (15)

PPTX
片手間JS on Rails
PDF
Ember コミュニティとわたし
PDF
gem の探し方
PDF
Rails あるある
PDF
How to relaunch "sapporojs.org" ~Introduction to middleman~
PDF
コミュニティのある風景
KEY
capybara で快適なテスト生活を
PDF
Testable JavaScript
PDF
Social coding をもっと楽しみたいあなたへ
PDF
Clean Javascript
KEY
Node.jsってどうなの?
KEY
アジャイル的アプローチから見えてきたこと
PDF
脱レガシー化計画
PDF
Pusherとcanvasで作るリアルタイムグラフ
PDF
ServerSideJavaScript
片手間JS on Rails
Ember コミュニティとわたし
gem の探し方
Rails あるある
How to relaunch "sapporojs.org" ~Introduction to middleman~
コミュニティのある風景
capybara で快適なテスト生活を
Testable JavaScript
Social coding をもっと楽しみたいあなたへ
Clean Javascript
Node.jsってどうなの?
アジャイル的アプローチから見えてきたこと
脱レガシー化計画
Pusherとcanvasで作るリアルタイムグラフ
ServerSideJavaScript

Introduction for Browser Side MVC