Ir al contenido principal

Destacado

C4 Model | Por una mejor comunicación

Introducción. Han pasado muchos años desde la introducción de UML en el ámbito del desarrollo de software, con la llegada de Agile , la forma de desarrollar software cambió drásticamente: algunos conceptos evolucionaron, aparecieron nuevos mientras que otros fueron abandonados. Hoy en día, UML es utilizado por contadas personas,  la propia industria ha dejado de lado aquellos elaborados diagramas,  recurriendo a diagramas genéricos o diagramas parciales, altamente variados entre sí, para representar y describir arquitecturas/diseños. Aquí es donde entra Simon Brown , quien identificó este problema de comunicación dentro de las organizaciones. Para solucionarlo, desarrolló el modelo C4 , un sistema de modelos, capaz de describir el software de manera clara y accesible, no solo para  los equipos de desarrollo y arquitectos sino para todo aquel interesado en comprender el funcionamiento y  estructura de un sistema . Modelo C4. El modelo C4 se basa en un c...

Backbone II | Modelos

Bueno hoy hablaremos un poco más de Backbone, en el capítulo anterior vimos una introducción leve a los modelos, en este pequeño post vamos a profundizar un poco más.

Requerimientos:


Modelos.
Como ya habíamos visto los modelos no son más que una representación lógica de una entidad de datos, Backbone provee una definición para definir y trabajar con ellos

Creación.
Lo primero que hay que hacer es definir nuestras clases Modelos mediante el método extend de Backbone.Model:

// Definición del User Model
var User = Backbone.Model.extend({});
// Instancia de Usuario
var testUser = new User( { name: 'Mario', username: 'mario192', email: 'mario@hotmail.com.tv'} );

console.log(testUser.get('name'));
// Mario
console.log(testUser.get('email'));
// mario@hotmail.com.tv


En este caso definimos un modelo User vacío sólo para efectos del ejemplo pero es posible definir cuantas propiedades necesitemos.


Creación con Defaults.
Los modelos tienen una propiedad llamada defaults que sirve para definir los valores por defecto que se asignaran a los atributos si estos no son especificados al momento de crear el objeto.

var User = Backbone.Model.extend({
    defaults: {
        name: '',
        username: 'test@gmail.com',
        email: '',
        phone: '0000-00-00-00',
        address: [],
        company: null
    }
});

var testUser = new User({name:'test'});

console.log(testUser.get('username'));
// test@gmail.com

console.log(testUser.get('name'));
// test

Constructor/Initialize
Es posible definir una propiedad constructor o initialize que será llamada cada vez que se cree una instancia y a través de la cuál se pueden pasar los valores iniciales de la data en un modelo.

var User = Backbone.Model.extend({
    defaults: {
        name: '',
        username: 'test@gmail.com',
        email: '',
        phone: '0000-00-00-00',
        address: [],
        company: null
    },
    initialize: function(attributes, options) {
        this._isBlocked = false;
    }
});

Estado ( data )
El estado de un modelo se almacena en una propiedad especial llamada attributes, está propiedad contiene por lo general un objeto JSON que representan los datos en el servidor.

No se recomienda manipular directamente esta propiedad, Backbone dispone de dos métodos en dado caso de que se requiera obtener o actualizar dichos valores.

Actualizar Estado ( data )
Para actualizar el estado de alguna de las propiedades en attributes se emplea el método set definido en Backbone.Model

var User = Backbone.Model.extend({
    defaults: {
        name: '',
        username: 'test@gmail.com',
        email: '',
        phone: '0000-00-00-00',
        address: [],
        company: null
    },
    initialize: function(attributes, options) {
        this._isBlocked = false;
    }
});

var testUser = new User({name: 'Susan'});
console.log(testUser.attributes['name']);
// Susan

testUser.set('name', 'Ash');
console.log(testUser.attributes['name']);
// Ash

Leer Estado ( data )
Para obtener el valor/estado de alguna de las propiedades en attributes se usa el método get ( Ya lo hemos usado en los ejemplos anteriores )
var User = Backbone.Model.extend({
    defaults: {
        name: '',
        username: 'test@gmail.com',
        email: '',
        phone: '0000-00-00-00',
        address: [],
        company: null
    },
    initialize: function(attributes, options) {
        this._isBlocked = false;
    }
});


var testUser = new User({name: 'Susan'});
console.log(testUser.get('name']);
// Susan  

REST Integration
Otra de las ventajas que obtenemos al usar Backbone es la integración transparente con RESTFUL APIs, solo basta definir la URL de nuestro endpoint en el modelo ( o colección ) y listo.
 
// Modelo independiente de Colección
var User = Backbone.Model.extends({
    urlRoot: 'https://jsonplaceholder.typicode.com/users'    
}); 

Cuando se trate de modelos que no estarán ligados a  una colección es necesario manipular la propiedad urlRoot  en caso contrario sólo modificamos la propiedad url.

Tanto los modelos como las colecciones proveen la siguiente interfaz para comunicarse con los RESTFUL endpoints:

GET  /books/ .... collection.fetch();
POST /books/ .... collection.create();
GET  /books/1 ... model.fetch();
PUT  /books/1 ... model.save();
DEL  /books/1 ... model.destroy(); 


Solicitando un usuario:

var User = Backbone.Model.extend({
  urlRoot: 'https://jsonplaceholder.typicode.com/users',
});

var testUser = new User({id:1});
testUser.fetch();
Creando un usuario:
var User = Backbone.Model.extend({
  urlRoot: 'https://jsonplaceholder.typicode.com/users',
});

var testUser = new User({name:'Susan', email:'susan@test.com'});
testUser.save();


Actualizando un usuario:
var User = Backbone.Model.extend({
  urlRoot: 'https://jsonplaceholder.typicode.com/users',
});

var testUser = new User({id:1});
testUser.fetch(); 
 
// Esperamos a que termine el request 
testUser.on('sync', function() {
    testUser.set('name', 'Marco Polo');
    testUser.save();
});


Eliminando un usuario:
var User = Backbone.Model.extend({
  urlRoot: 'https://jsonplaceholder.typicode.com/users',
});

var testUser = new User({id:1});
testUser.fetch();

// Esperamos a que termine el request
testUser.on('sync', function() {
    testUser.destroy();
});


Creo que por el momento es todo, suficiente información para procesar... happy hacking!

Comentarios

Entradas populares