Pratiche per i modelli di dominio in Javascript (con framework)

8

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.

    
posta Andy Hunt 15.09.2013 - 21:52
fonte

2 risposte

0

Penso che buoni schemi di design e un framework come Breeze possano aiutarti. Non ripetere di nuovo il modello di dominio sul client, lascialo sul server ma usa Breeze per caricare il modello sul client.

Ecco un ottimo esempio dell'utilizzo di breezejs con il repository e l'unità di modelli di lavoro.

link

Il modello di dominio viene mantenuto sul server e brezza legge i metadati e crea le entità localmente dal server. Penso che questa sia un'ottima soluzione al tuo problema. È possibile accedere localmente al tipo di struttura di entità locale tramite JS e mantenere il modello sul server. Penso che trovi un buon equilibrio tra i problemi che hai sollevato nella tua domanda.

    
risposta data 07.11.2013 - 21:48
fonte
3

La tua domanda attuale è un po 'più generale, quindi è difficile rispondere, ma l'esempio di validazione del modulo è un po' più specifico, quindi cercherò di seguirlo.

Come hai detto dovresti essere sempre ASCIUTTO, per quanto possibile. Questa è una buona cosa da tenere a mente come sviluppatore. Tuttavia dovresti distinguere tra le cose che sono simili e dovresti evitare di ripeterle con le cose che fanno cose simili, ma hanno Scopi diversi.

Passiamo all'esempio di convalida del modulo. Lo scopo del codice di convalida sul server è di assicurarsi di avere l'indirizzo email dell'utente per esempio da inserire nel database. Pertanto, poiché è obbligatorio che il processo di registrazione abbia l'indirizzo email dell'utente, lo stai verificando durante il processo di registrazione.

Ma qual è lo scopo del tuo codice JavaScript sul lato client? Sì, fa la convalida sul campo di input dell'email, ma l'idea è tutta: per verificare se l'utente ha già inserito il suo indirizzo email, se non mostrare loro un avviso PRIMA inviandolo al server! Quindi lo scopo della convalida del modulo sul lato client è di interrompere l'invio di dati inutili al server e mostrare un messaggio di errore dopo alcuni secondi per inviare nuovamente il modulo di domanda. Perché? perché è fastidioso per gli utenti. Ora pensi che dovresti mantenere la funzione di convalida del modulo solo sul server? No, perché hanno scopi diversi.

Lo scopo della convalida del modulo sul lato client non è Non posso fidarmi degli utenti, controlliamolo , ma è più di una cosa UX in cui stai cercando di evitare di comunicare con il server solo per ottenere il messaggio di errore di convalida; Tuttavia lo scopo della convalida del modulo sul lato server è che non posso fidarmi degli utenti, vediamo cosa mi chiedono di fare , e un utente può essere anche una richiesta API - senza alcun utente umano sul lato client.

Se lo guardi in questo modo, il tuo esempio di validazione del modulo sarebbe perfetto, senza farti sentire WET.

Per quanto riguarda la tua domanda attuale, non cercare di tenere tutto sul server o tutto sul client; Dipende davvero dal compito. Diciamo se ho bisogno di analizzare un file CSV di grandi dimensioni per l'utente e ho solo un centinaio di utenti sul sito web e so che ho utenti mobili, quindi posso analizzare quel file sul server e quindi emetterlo in modo corretto -a-diga markup al cliente. Tuttavia, se avessi milioni di utenti, proverei ad analizzare il file sui loro computer - usando i loro browser web per usare la loro potenza di elaborazione per evitare di bruciare il nostro server. Quindi la funzionalità di analisi potrebbe essere sul server o sul client, qualsiasi cosa abbia più senso.

Tuttavia, se non sei sicuro di dove tenere le tue cose, allora direi di tenerle sul server e di fornire i risultati agli utenti, evitando codice duplicato su server e client.

    
risposta data 07.04.2014 - 09:45
fonte

Leggi altre domande sui tag