Agenda

  • SOFEA
  • REST
  • Backbone
  • HTML5
  • blogMV*
  • Show me the code bitch!!!

WTF is SOFEA?

SOFEA?


Service Oriented Front End Architecture



"Proposes to remove all presentation
layer logic from the server to JavaScript
logic on the client."

thinserverarchitecture.com

O que ganhamos com isso?



  • Divisão de responsabilidades no desenvolvimento;
  • Baixo acoplamento das camadas;
  • Comunicação client/server através de verbos HTTP;
  • O client requisita o que e quando;

REST



“Software architectural style consisting of a
coordinated set of architectural constraints applied
components, conectors and data elements, within
a distributed hypermedia system.”

Roy Thomas Fielding

Características


  • Client-Server
  • Stateless
  • Cache
  • HTTP verbs: GET, POST, PUT, DELETE...
  • Status code
  • Content negociation (Accept: json, xml, html)

Backbone




“Gives structure to web applications by providing
models, collections and views to consume API over
a RESTful JSON interface.”

backbonejs.org

Idéia geral




"Te permite ter o poder de uma arquitetura MV*
além do controle sobre a mesma, para consumir API
através de uma interface RESTful."

Eu mesmo

Características


  • Poderosa LIB JavaScript
  • Adaptável, baseada no padrão MV*
  • Moderninha, largamente usada em SPA
  • Magrinha, apenas 6.5Kb

Pontos negativos


  • Memory leak
  • One template per view
  • No way data-binding
  • Comunidade pequena no Brasil

Quem está usando?






Desmistificando...

  • Putz, Backbone é complicado;
  • Que nada é super simples, ele implementa diversos conceitos de O.O.
  • Ah! é muito verboso;
  • Uéh, qual o problema disso? A gente é mágico ou programador?
  • Piá, arquiteturas MV* são coisas do capeta;
  • Tá louco, é a coisa mais incrível e organizada que existe!
  • Hey, MVC é muito engessado;
  • No Backbone não, no MV* é tudo bem desacoplado :-)

Arquitetura MV*


Model + View + Whatever you need!!!

View

É o que o cliente vê

Model

É o responsável pelo que a view consome

Collection

É uma coleção de modelos

* Whatever you need

É o que você precisar para a sua aplicação

Na prática isso quer dizer...

Tic Tac Toe Game

HTML5 é a n...







Tá de brinqueichon
uite me, cara?

HTML5 Rocks

W3C

blogMV o quê?

  • Iniciativa open source brasileira que visa ensinar a criação de SPA através de libs ou frameworks sobre um esqueleto comum.
    • Backbone.js
    • Angular.js
    • React.js
    • Ember.js
    • Knockout.js
    • Just Vanilla baby

Mas por quê?

  • Queremos contribuir com o crescimento profissional da comunidade e aumentar o engajamento e envolvimento da mesma em:

    • Debates
    • Projetos
    • Encontros
    • Colaborações

Para quem?

blogMV*

API Design





            GET
            /articles

            GET
            /articles/{article_id}

            PUT
            /articles/{article_id}

            DELETE
            /articles/{article_id}
    

Collection





      var ArticleCollection = Backbone.Collection.extend({
          url:   'http://blogmv-api.appspot.com/api/articles',
          model: ArticleModel
      });

      return ArticleCollection;
      

/articles





        [
           {
              "content":"Lorem ipsum dolor sit amet, consectetur adipisicing...",
              "id":5639445604728832,
              "title":"Hello World"
           },
           {
              "content":"Iraqi PM Nouri Maliki steps aside, ending political...",
              "id":5707702298738688,
              "title":"Bye World"
           }
        ]
    

Model





        var ArticleModel = Backbone.Model.extend({
            getTitle: function() {
                return this.get('title');
            },

            getContent: function() {
                return this.get('content');
            }
        });

        return ArticleModel;
      

View





        var AppView = Backbone.View.extend({
            initialize: function() {
                this.setup();
            },

            setup: function() {
                this.collection = new ArticleCollection();
                this.collection.fetch();
                this.listenTo(this.collection, 'sync', this.render);
            }
        });
      

collection.fetch();



Here is where the magic doesn't happen!


this.listenTo();



Mágica? Fala para eles, Isabelle


View





        var AppView = Backbone.View.extend({
            render: function() {
                this.$el('.list-group').html(this.template({
                    'collection' : this.collection
                }));
            }
        });
      

View





        var AppView = Backbone.View.extend({
            template: _.template( $('#tmp-article-list').html() ),

            el: '.main'
        });
      

HTML



      <div class="main">
          <h2>JS News</h2>

          <ul class="list-group">
              <script type="text/html" id="tmp-article-list">
                  <% collection.each(function(model){ %>
                      <li>
                          <a href="#article/<%= model.id %>" class="list-group-item">
                              <%= model.getTitle() %>
                          </a>
                      </li>
                  <% }); %>
              </script>
          </ul>
      </div>
      

Divisão de

responsabilidades



  • Cada camada deveria tratar das suas responsabilidades.
    • Collection deveria retornar apenas a coleção de models;
    • Model deveria retornar apenas dados íntegros do model;
    • View deveria retornar dados repassados pelo model;
      • Quando o dado precisar de tratamento visual para o html

Olha o nosso filho surgindo





Vamos criar a nossa...





View





        var AppView = Backbone.View.extend({
            events: {
                'click .list-group-item' : 'setModel'
            },

            setModel: function() {
                this.model.set({ change: true, this.model });
            }
        });
      

ContentView





        var ContentView = Backbone.View.extend({
            initialize: function(model) {
                this.setup(model);
            },

            setup: function(model) {
                this.activeModel = model;
                this.listenTo(this.activeModel, 'change', this.render);
            }
        });
      

ContentView





        var ContentView = Backbone.View.extend({
            render: function() {
                this.$el('article').html(this.template({
                    'activeModel' : this.activeModel
                }));
            }
        });
      

ContentView





      template: _.template( $('#tmp-article-content').html() ),

      el: '.main'
      

ContentView





      <section class="main">
          <article>
              <script type="text/html" id="tmp-article-content">
                  <h2><%= activeModel.getTitle() %></h2>
                  <p><%= activeModel.getContent() %></p>
              </script>
          </article>
      </section>
      

Nossa "mágica"...





...and our "magic"
goes on and on



That's all folks!



Ah! e não esqueçam do ;