Duplicazione del codice (backend e javascript - knockout)

4

Abbiamo un nuovo sviluppatore nel nostro team. Sembra essere un ragazzo intelligente (è appena entrato quindi non posso davvero giudicare). Ha iniziato implementando alcuni piccoli miglioramenti sul progetto (applicazione web MVC3 che utilizza Javascript con jQuery e Knockout ).

Diciamo che abbiamo due valori:

A - quite complex calculation    
C - constant    
B = A + C

Sullo schermo c'è il valore B e l'utente può cambiarlo (normale texbox). Quando B cambia, anche A cambia perché C è costante. Quindi esiste una dipendenza lineare tra A e B.

Ora, tutti i calcoli sono fatti nel back-end, ma dobbiamo ricalcolare A come utente cambia B (in Javascript, userei knockout). Ho pensato di memorizzare i vecchi A e B e quando B cambia di 10, allora sappiamo che il nuovo A sarà old A + 10 . Dice che questo è sporco, perché è duplicazione del codice (ci avvaliamo del fatto che sono dipendenti e secondo lui dovrebbe essere solo in un posto nella nostra app). Capisco che non è l'ideale, ma fare richiesta AJAX dopo ogni pressione di tasto sembra un po 'troppo.

È una cosa davvero piccola e non pubblicherei se non abbiamo avuto una lunga discussione al riguardo.

Come gestisci questi problemi? Inoltre, posso immaginare che l'utilizzo del knockout implichi molti calcoli sul lato client, il che porta molto spesso alla duplicazione degli stessi calcoli dal back-end. Qualcuno ha dei link ad alcuni articoli / pensieri su questo argomento?

    
posta Michal B. 20.11.2012 - 10:29
fonte

4 risposte

8

Penso che le funzionalità di interfaccia in tempo reale, lato client e più reattive a volte finiscono per costituire un'eccezione alla regola DRY in casi come quello che hai descritto. Il bisogno di reattività merita il codice lato client, ma spesso ci si ritrova a calcolare questi valori sul back-end prima di passarli al front-end; i valori vengono quindi ricalcolati dinamicamente quando l'utente regola l'interfaccia in qualche modo.

Una cosa che posso dire con certezza: non vale la pena di andare al server, a meno che non sia ok che i tuoi valori sul front-end aggiornino solo il secondo o più. Qualsiasi valore inferiore a quello e potrebbe non avere solo problemi con le risposte che ritornano fuori servizio, ma un certo comportamento di aggiornamento fastidioso anche se il primo non è un problema.

Ho sempre pensato che - ad un certo punto - questa sarebbe stata la ragione principale per l'utilizzo di Javascript sia sul fronte che sul back-end, ma non so se qualcuno abbia mai provato un trasporto di codice comune o qualcosa del genere.

Se mai, mi chiedevo se fosse necessario avere questi calcoli nel tuo modello di backend / codice lato server - forse hai bisogno di assicurati che i contrappunti lineari tra le variabili siano soddisfatti per ragioni di coerenza, di sicurezza, ecc., ma - se non lo sono, e se non chiami esplicitamente questi calcoli da qualche parte nel tuo back-end - allora ti suggerirei di prenderli fuori da lì.

    
risposta data 20.11.2012 - 10:45
fonte
5

Credo che tu abbia frainteso il tuo collega.

Questa non è una duplicazione tra codice lato server e codice lato client.

La duplicazione sarebbe avere il codice sul lato server facendo il "calcolo abbastanza complesso" di cui parli, e il codice sul lato client facendo lo stesso calcolo : se stai cambiando uno , dovresti cambiare il secondo, a meno che non sia accettabile ottenere risultati incoerenti.

Invece, qui, il codice lato client sta solo ricordando il risultato del calcolo, niente di più. Pertanto, quando si modifica il calcolo, è necessario farlo solo dal lato server.

Detto questo, ciò che il tuo collega potrebbe aver detto è che tu stai reinventando la ruota . GET Le query AJAX possono essere memorizzate nella cache dal browser e non è necessario duplicare in JavaScript la funzione di memorizzazione nella cache già implementata nel browser . Se per gli stessi parametri, il risultato del calcolo è lo stesso (non dipende dall'ora del sistema, dallo stato dell'applicazione, dal database o dai file), è sufficiente conservarlo in cache per un lungo periodo di tempo e assicurarsi che, una volta memorizzato nella cache, la richiesta non venga eseguita raggiungere il tuo server.

    
risposta data 20.11.2012 - 11:22
fonte
4

In una situazione leggermente più complessa, ho deciso di utilizzare AJAX per assicurarmi che il calcolo venga eseguito solo in un punto, cioè sul server. Codificare lo stesso calcolo due volte (sul server in C #, nel browser in JavaScript) è la duplicazione del codice e potrebbe influire negativamente sulla manutenzione; fare uso di una proprietà della calulazione come hai proposto sembra ancora più pericoloso perché una volta che qualcuno decide che d'ora in poi, la formula deve essere

 B = A * 1.05 + C

il tuo codice creerà errori impercettibili e probabilmente causerà molti mal di testa.

    
risposta data 20.11.2012 - 12:37
fonte
0

Se strongmente desiderato, il codice comune può essere isolato in più lingue e ambienti.

Immagina di mantenere la stessa applicazione scritta sia in Java che in C. Hanno in comune diversi argomenti da riga di comando; tuttavia, alcuni parametri differiscono. È possibile scrivere l'aiuto per entrambe le applicazioni in modo indipendente (una volta in Java, una volta in C), ignorando il principio DRY. È possibile scrivere un file di aiuto una volta in XML e utilizzare i fogli di stile per generare una classe Help di Java e una funzione help . Ad esempio:

<?xml version="1.0"?>
<help>
  <param name="server" abbr="s" lang="both" arg="string">Application server name.param>
  <param name="garbage" abbr="g" lang="java" arg="nil">Attempt garbage collection.</param>
</help>

Ciò consente di generare aiuto per entrambe le applicazioni e - con poco lavoro in più - iniettare i parametri nel codice di analisi della riga di comando.

Nel tuo caso particolare, hai codice server e codice client che esegue un calcolo. Se vuoi davvero isolare il calcolo, puoi descrivere il calcolo in un formato neutrale alla lingua e quindi generare il codice corrispondente per il server e il client.

Le costanti sono un problema simile: come si mantiene un elenco di costanti all'interno di un'applicazione client-server, mentre si applica il principio DRY? Utilizzare una tabella di database per memorizzare il nome e il valore delle costanti e quindi generare il codice comune (interfacce Java, globali PHP, variabili JavaScript e simili).

Vedi anche: link

    
risposta data 20.11.2012 - 18:31
fonte

Leggi altre domande sui tag