Dies ist eine Frage, mit der ich mich eine Weile beschäftigt habe und nach der ich gesucht und nichts gefunden habe: Was sind die akzeptierten Praktiken beim Duplizieren von Domänenmodellen in Javascript für eine Webanwendung, wenn ein Framework wie Backbone verwendet wird? oder Knockout?
Sollten wir bei einer nicht trivialen Webanwendung mit einer Reihe von Domänenmodellen auf der Serverseite diese Modelle in der Webanwendung duplizieren (siehe Beispiel unten)? Oder sollten wir die dynamische Natur nutzen, um diese Modelle vom Server zu laden?
Meiner Meinung nach bestehen die Argumente für das Duplizieren der Modelle darin, die Validierung von Feldern zu vereinfachen und sicherzustellen, dass tatsächlich vorhandene Felder vorhanden sind usw. Mein Ansatz besteht darin, den clientseitigen Code wie eine fast separate Anwendung zu behandeln und triviale Dinge zu tun selbst und nur für Daten und komplexe Vorgänge auf den Server angewiesen (für die Daten erforderlich sind, über die die Clientseite nicht verfügt). Ich denke, dass die Behandlung des clientseitigen Codes wie eine Trennung zwischen Entitäten von einem ORM und den Modellen ist, die mit der Ansicht in der UI-Ebene verwendet werden: Sie haben möglicherweise dieselben Felder und beziehen sich auf dasselbe Domänenkonzept, sind jedoch unterschiedlich Dinge.
Andererseits scheint es mir, dass das Duplizieren dieser Modelle auf der Serverseite eine eindeutige Verletzung von DRY darstellt und wahrscheinlich zu unterschiedlichen Ergebnissen auf der Client- und Serverseite führt (wobei ein Teil aktualisiert wird, der andere jedoch nicht ). Um diese Verletzung von DRY zu vermeiden, können wir einfach die Dynamik von Javascripts verwenden, um die Feldnamen und Daten vom Server abzurufen, sobald sie benötigt werden.
Also: Gibt es akzeptierte Richtlinien, wann (und wann nicht) Sie sich in diesen Situationen wiederholen sollten? Oder ist dies eine rein subjektive Sache, basierend auf dem Projekt und den Entwicklern?
Beispiel
Serverseitiges Modell
class M
{
int A
DateTime B
int C
int D = (A*C)
double SomeComplexCalculation = ServiceLayer.Call();
}
Client-seitiges Modell
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());
};
Ich weiß , diese Frage ist ganz ähnlich wie diese , aber ich denke , das mehr ist über fast ganz die Web - Anwendung auf dem Server Aufhebung der Bindung, wo die Frage nach nur im Fall von komplexen Berechnungs dies zu tun ist.
M.getComplexValue()
möchten Sie möglicherweise auch das "Promise" -Muster untersuchen, um die Callback-Hölle zu minimieren und gleichzeitig zu ermöglichen, dass alle Vorgänge (möglicherweise) asynchron sind.