Upgrade to Pro — share decks privately, control downloads, hide ads and more …

MVC, MVVM & MVP ... números romanos o que?

MVC, MVVM & MVP ... números romanos o que?

Cada vez es más común el desarrollo de aplicaciones complejas donde la base de código, en gran parte o totalmente, está desarrollada en Javascript. Es aquí donde la mantenibilidad y testeabilidad de la apliación empieza a ser un gran problema.Es por esto que patrones que han probado ser útiles en el desarrollo de aplicaciones de escritorio empiezan a ser aplicados en el desarrollo de aplicaciones web, existiendo actualmente varios frameworks en JS que dicen implementarlos. La idea de la charla es revisar estos patrones y algunos de los frameworks más populares.

Guido Marucci Blas

May 20, 2012
Tweet

More Decks by Guido Marucci Blas

Other Decks in Programming

Transcript

  1. jQuery Node Bootstrap Backbone d3 three.js raphael socket.io express Ember

    Kendo Sencha JavaScript Momentum PhantomJS Jasmime underscore
  2. a b a r c a r t o d

    a s l a s plataformas
  3. reutilizar código reutilizar código reutilizar código reutilizar código reutilizar código

    reutilizar código reutilizar código reutilizar código reutilizar código reutilizar código
  4. $(function() { $(“input[type=search]”).chozen(); $(“select”).change(function(e) { $(“.loading”).fadeIn(); var category = $(this).val();

    var query = $(“input[type=search]”).val(); $.ajax({ url: “http://api.sky.net/terminators”, dataType: “jsonp” data: { category: category, query: query }, success: function(data) { $(“.loading”).fadeOut(); VIEWS.renderTerminator(data); window.history.pushState(“/search?query=” + query + “&category=” + category); } error: function() { $(“.loading”).fadeOut(); spaghetti code Lógica de presentación mezclada con lógica de negocios ¿testeabilidad & mantenibilidad? ... pero ...
  5. TDD

  6. Model Controller View Actualiza el estado del modelo Actualiza elementos

    de la vista Notifica cambios a la vista para ser renderizados Notifica gestos Llamada a un método Notificación de evento
  7. View Llamada a un método Notificación de evento Model Actualiza

    el estado del modelo Notifica cambios de propiedades Actualiza la vista Presenter Notifica interacción
  8. View Model View Llamada a un método Notificación de evento

    Model Envío de comandos Actualiza el estado del modelo Notifica cambios de propiedades Notifica cambios para renderiar
  9. Knockout Los bindings se hacen en el HTML <div  class="user-view">

       Nombre:      <strong  data-­‐bind="text:firstName">    </strong> </div>
  10. Knockout var UserViewModel = function(firstName, lastName) { this.firstName = ko.observable(firstName);

    this.lastName = ko.observable(lastName); } var vm = new UserViewModel("juan", "pérez"); ko.applyBindings(vm, "div.user-view"); ... vm.firstName("pablo"); ...
  11. Backbone Router Se encarga de asociar una ruta a una

    función var Workspace = Backbone.Router.extend({ routes: { "help": "help", "search/:query": "search", "search/:query/p:page": "search" }, help: function() { ... }, search: function(query, page) { ... } });
  12. Backbone Model Notifica eventos cuando cambia el estado var User

    = Backbone.Model.extend({ defaults: { firstName: "juan", lastName: "pérez" } fullName: function() { return this.get("firstName") + " " + this.get("lastName"); } }); new User().on("change:firstName", function(){alert("Hello!")});
  13. Backbone Model Cada modificación es enviada al servidor user.set("firstName", "Guido");

    ... genera automáticamente ... POST /users/1 HTTP/1.1 Content-Type: "application/json" {"id":"1", firstName": "Guido"}
  14. Backbone Collection Es un set ordenado de objetos de modelo

    var Users = Backbone.Collection.extend({ model: User });
  15. Backbone Collection Se sicroniza con el servidor mediante operaciones REST

    Create - POST /collection Read - GET /collection Update - PUT /collection/id Delete - DELETE /collection/id
  16. Backbone View Representa un componente de UI reusable UserView =

    Backbone.View.extend({ events: { ".update-btn click": "updateUser" }, initialize: function() { this.model.on("change", this.render, this); }, render: function() { // Update DOM } });
  17. Spine UserView = Spine.Controller.sub({ events: { ".update-btn click": "updateUser" },

    init: function() { var render = this.proxy(this.render, this); this.item.bind("change", render); }, render: function() { // Update DOM } }); Spine Controller = Backbone View
  18. Spine No hay colecciones como en backbone var users =

    User.all(); var user = User.find(1); var user = User.findByAttribute("name", "juan"); var allowedUsers = User.select(function(user) { return user.age >= 18 };
  19. Spine No hay router Las rutas se declaran en el

    controller var MyController = Spine.Controller.sub({ init: function() { this.routes({ "/user/:email" : function(params) { console.log(params.email) } }); } });
  20. Spine Los controllers se pueden agrupar en stacks var PostsShow

    = Spine.Controller.sub(); var PostsEdit = Spine.Controller.sub(); var Posts = Spine.Stack.sub({ controllers: { show: PostsShow, edit: PostsEdit }, default: "show" });
  21. Ember Incluye un poderoso sistema de data binding app.user =

    Ember.Object.create({ firstName: "Juan", lastName: "Pérez", age: 19 }); app.userView = Ember.View.create({ firstNameBinding: "app.user.firstName", lastNameBinding: "app.user.lastName", textColor: function() { return (app.user.get("age")) >= 18 ? "green" : "red"; }.property(); });
  22. Ember Las vistas escuchan propiedades y se actualizan solas <script

    type="text/x-handlebars"> <div {{bindAttr class="textColor"}}> Nombre: {{app.userView.firstName}} </div> </script>