Esta es una pregunta con la que he estado yendo y viniendo por un tiempo, y busqué y no encontré nada: ¿cuáles son las prácticas aceptadas que rodean la duplicación de modelos de dominio en Javascript para una aplicación web, cuando uso un marco como Backbone? o Knockout?
Dada una aplicación web de un tamaño no trivial con un conjunto de modelos de dominio en el lado del servidor, ¿deberíamos duplicar estos modelos en la aplicación web (ver el ejemplo al final)? ¿O deberíamos usar la naturaleza dinámica para cargar estos modelos desde el servidor?
En mi opinión, los argumentos para duplicar los modelos están en facilitar la validación de los campos, asegurando que los campos que se esperaban que estén presentes, de hecho, etc. Mi enfoque es tratar el código del lado del cliente como una aplicación casi separada, haciendo cosas triviales. solo y depender del servidor para datos y operaciones complejas (que requieren datos que el lado del cliente no tiene). Creo que tratar el código del lado del cliente de esta manera es similar a la separación entre entidades de un ORM y los modelos utilizados con la vista en la capa de IU: pueden tener los mismos campos y estar relacionados con el mismo concepto de dominio, pero son distintos cosas.
Por otro lado, me parece que duplicar estos modelos en el lado del servidor es una clara violación de DRY y es probable que conduzca a resultados diferentes en el lado del cliente y del servidor (donde una parte se actualiza pero la otra no) ) Para evitar esta violación de DRY, simplemente podemos usar el dinamismo de Javascripts para obtener los nombres de campo y los datos del servidor cuando sea necesario.
Entonces: ¿existen pautas aceptadas sobre cuándo (y cuándo no) repetirse en estas situaciones? ¿O esto es algo puramente subjetivo, basado en el proyecto y los desarrolladores?
Ejemplo
Modelo del lado del servidor
class M
{
int A
DateTime B
int C
int D = (A*C)
double SomeComplexCalculation = ServiceLayer.Call();
}
Modelo del lado del cliente
function M(){
this.A = ko.observable();
this.B = ko.observable();
this.C = ko.observable();
this.D = function() { return A() * C(); }
this.SomeComplexCalculation = ko.observalbe();
return this;
}l
M.GetComplexValue = function(){
this.SomeComplexCalculation(Ajax.CallBackToServer());
};
Me doy cuenta de que esta pregunta es bastante similar a esta , pero creo que se trata más de desvincular casi por completo la aplicación web del servidor, donde esa pregunta se trata de hacer esto solo en el caso de cálculos complejos.
M.getComplexValue()
, es posible que desee analizar el patrón "Promesa" como una forma de minimizar el infierno de devolución de llamadas mientras permite que todas las operaciones sean (potencialmente) asíncronas.