Non esiste una risposta semplice a questa domanda. Ci sono molte diverse architetture software / strategie di implementazione che possono raggiungere questo obiettivo. Tutto dipende da quanto è complessa la tua applicazione e da quanto può diventare complessa un giorno.
Iniziamo con un semplice tipo di architettura MVC. Qui trattate il vostro codice lato client come una vista, il vostro server come un controller e trasferite il modello (cioè i vostri dati) tra la vista e il controller. Ciò consente di mantenere tutta la logica in un'unica posizione e di servire più visualizzazioni (ad es. App telefoniche, siti Web o persino interfacce di prompt di testo!). Fin qui tutto bene.
Tuttavia, quando ti impegni a farlo, ti troverai a definire più MVC all'interno della tua vista. Delegare ogni singolo controller sul lato server complicherà la progettazione e / o peggiorerà le prestazioni (fai 2 + 2 sul lato server o sul lato client?). Quindi ad un certo punto devi smettere di costruire controller sul lato server. L'arte è nel sapere dove fermarsi.
Tre semplici linee guida possono aiutare. Innanzitutto, se un calcolo / algoritmo è una costante del mondo e non è correlato alla logica "aziendale" dell'applicazione, in genere è possibile codificarlo sul lato client. Secondo, potresti non volerlo fare se l'algoritmo è complesso (ha bisogno di molti dati da altri / tuoi server, ha bisogno di molta CPU che il tuo utente tipico non avrà, ecc.). Terzo, potresti non voler spedire la logica lato client che ti dà un margine di proprietà per timore di qualcuno che inverta la logica della tua logica.
Prendiamo il problema dell'equazione. Non è banale, può cambiare perché ci sono diversi modi per risolvere un determinato problema (comprese aggiunte di passaggi banali per semplificare i passaggi esistenti) e costoso da costruire (quindi potresti non volere che qualcuno rubi il tuo duro algoritmo).