Questa è una domanda che ho per un po 'e ho cercato e non ho trovato nulla su: quali sono le pratiche accettate che circondano la duplicazione dei modelli di dominio in Javascript per un'applicazione web, quando si usa un framework come Backbone o Knockout?
Dato un'applicazione web di dimensioni non banali con un insieme di modelli di dominio sul lato server, dovremmo duplicare questi modelli nell'applicazione web (vedi l'esempio in basso)? O dovremmo usare la natura dinamica per caricare questi modelli dal server?
A mio parere, gli argomenti per duplicare i modelli sono nella convalida dei campi, assicurando che i campi che dovrebbero essere presenti siano effettivamente presenti ecc. Il mio approccio è trattare il codice lato client come un'applicazione quasi separata, facendo cose banali e affidandosi solo al server per dati e operazioni complesse (che richiedono dati non disponibili sul lato client). Penso che trattare il codice lato client come questo sia simile alla separazione tra entità da un ORM e ai modelli usati con la vista nel livello dell'interfaccia utente: potrebbero avere gli stessi campi e riguardare lo stesso concetto di dominio, ma sono distinti le cose.
D'altra parte, mi sembra che duplicare questi modelli sul lato server sia una chiara violazione di DRY e possa portare a risultati diversi sul lato client e server (dove un pezzo viene aggiornato ma l'altro non lo fa). Per evitare questa violazione di DRY, possiamo semplicemente utilizzare il dinamismo di Javascripts per ottenere i nomi dei campi e i dati dal server come e quando sono necessari.
Quindi: ci sono delle linee guida accettate su quando (e quando no) ripeterti in queste situazioni? O questa è una cosa puramente soggettiva, basata sul progetto e sugli sviluppatori?
Esempio
Modello sul lato server
class M
{
int A
DateTime B
int C
int D = (A*C)
double SomeComplexCalculation = ServiceLayer.Call();
}
Modello lato client
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());
};
Mi rendo conto che questa domanda è abbastanza simile a questo , ma penso che si tratti più di svincolare quasi completamente l'applicazione web dal server, dove questa domanda riguarda il fare solo nel caso di calcoli complessi.