Esta é uma pergunta que eu andei de um lado para o outro, e não procurei e não encontrei nada sobre: quais são as práticas aceitas em torno da duplicação de modelos de domínio em Javascript para um aplicativo da Web, ao usar uma estrutura como o Backbone ou nocaute?
Dado um aplicativo da Web de tamanho não trivial com um conjunto de modelos de domínio no lado do servidor, devemos duplicar esses modelos no aplicativo da Web (veja o exemplo na parte inferior)? Ou devemos usar a natureza dinâmica para carregar esses modelos no servidor?
Na minha opinião, os argumentos para duplicar os modelos estão facilitando a validação de campos, garantindo que os campos que se espera estejam presentes estejam de fato presentes etc. Minha abordagem é tratar o código do lado do cliente como um aplicativo quase separado, fazendo coisas triviais sozinho e confiando apenas no servidor para dados e operações complexas (que exigem dados que o lado do cliente não possui). Eu acho que tratar o código do lado do cliente assim é semelhante à separação entre entidades de um ORM e os modelos usados com a visualização na camada da interface do usuário: eles podem ter os mesmos campos e se relacionar com o mesmo conceito de domínio, mas são distintos coisas.
Por outro lado, parece-me que duplicar esses modelos no lado do servidor é uma clara violação do DRY e provavelmente levará a resultados diferentes no lado do cliente e do servidor (onde uma peça é atualizada, mas a outra não ) Para evitar essa violação do DRY, podemos simplesmente usar o dinamismo de Javascripts para obter os nomes e dados do campo do servidor como e quando eles são necessários.
Então: existem diretrizes aceitas sobre quando (e quando não) se repetir nessas situações? Ou isso é puramente subjetivo, com base no projeto e no (s) desenvolvedor (es)?
Exemplo
Modelo do lado do servidor
class M
{
int A
DateTime B
int C
int D = (A*C)
double SomeComplexCalculation = ServiceLayer.Call();
}
Modelo do lado do cliente
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());
};
Sei que essa pergunta é bem parecida com essa , mas acho que isso é mais sobre desatamento quase total do aplicativo da Web do servidor, onde essa pergunta é sobre fazer isso apenas no caso de cálculos complexos.
M.getComplexValue()
você pode procurar no padrão "Promessa" como uma maneira de minimizar o retorno de chamada enquanto permite que todas as operações sejam (potencialmente) assíncronas.