Práticas para modelos de domínio em Javascript (com estruturas)


8

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.


A sua pergunta é mais sobre como você gerencia instâncias de objetos no lado JS para componentes desacoplados ou mais sobre a comunicação entre o cliente e o servidor? Além disso, 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.
Darien

É mais sobre a possibilidade de utilizar objectos definidos em JS (como no exemplo) ou um objecto anónima com campos preenchidos dinamicamente
Andy Hunt

Respostas:


0

Eu acho que bons padrões de design e uma estrutura como o Breeze podem ajudá-lo. Não repita o modelo de domínio no cliente novamente, deixe-o no servidor, mas use o Breeze para puxar o modelo para o cliente.

Aqui está um ótimo exemplo de uso de breezejs com os padrões de repositório e unidade de trabalho.

https://github.com/yagopv/DurandalAuth

O modelo de domínio é mantido no servidor e o brisa lê os metadados e cria as entidades localmente a partir do servidor. Eu acho que essa é uma ótima solução para o seu problema. Você obtém acesso do tipo de estrutura de entidade local localmente via JS e pode manter seu modelo no servidor. Eu acho que isso atinge um bom equilíbrio dos problemas que você levantou na sua pergunta.


2
Como isso responde à pergunta? Tal como está, parece mais um anúncio de spam.
Gnat #

1
É uma resposta bastante direta. A questão é repetir o modelo de domínio no cliente novamente. Minha resposta é não deixá-lo no servidor, mas a brisa do usuário para puxar o modelo para o cliente. Eu não sou afiliado com brisa ou durandal. Eu apenas acho as estruturas úteis.
21413 Roger Brogan #

3

Sua pergunta real é um pouco mais geral, por isso é difícil responder, mas o exemplo de validação de seu formulário é um pouco mais específico, então tentarei continuar com essa.

Como você disse, você deve estar sempre SECO, tanto quanto possível. É bom ter em mente como desenvolvedor. No entanto, você deve distinguir entre as coisas que são semelhantes e evitar repeti-las com as coisas que elas fazem coisas semelhantes, mas elas têm finalidades diferentes .

Vamos ao seu exemplo de validação de formulário. O objetivo do seu código de validação no servidor é garantir que o endereço de e-mail do usuário, por exemplo, seja inserido no banco de dados. Portanto, como é obrigatório que seu processo de registro tenha o endereço de e-mail do usuário, você está verificando isso durante o processo de registro.

Mas qual é o objetivo do seu código JavaScript do lado do cliente? Sim, ele faz a validação no campo de entrada de email, mas a ideia é toda: Para verificar se o usuário já inseriu seu endereço de email, se não mostrar um alerta antes de enviá-lo ao servidor! Portanto, o objetivo da validação do formulário do lado do cliente é parar de enviar dados inúteis para o servidor e mostrar uma mensagem de erro após alguns segundos para reenviar o formulário do aplicativo novamente. Por quê? porque é chato para os usuários. Agora, você acha que deve manter a função de validação de formulário apenas no servidor? Não, porque eles têm finalidades diferentes.

O objetivo da validação de formulário no lado do cliente não é não confiar nos usuários, vamos dar uma olhada , mas é mais uma coisa UX em que você está tentando evitar a comunicação com o servidor apenas para receber a mensagem de erro de validação; No entanto, o objetivo da validação de formulário no lado do servidor é que não posso confiar nos usuários, vamos ver o que eles estão me pedindo para fazer , e um usuário também pode ser uma solicitação de API - sem nenhum usuário humano no lado do cliente.

Se você olhar assim, seu exemplo de validação de formulário seria totalmente bom, sem fazer você se sentir molhado.

Em relação à sua pergunta real, não tente manter tudo no servidor ou tudo no cliente; Realmente depende da tarefa. Digamos que, se eu precisar analisar um arquivo CSV muito grande para o usuário e tiver apenas cem usuários no site e eu sei que tenho usuários móveis, posso analisar esse arquivo no servidor e gerar uma saída fácil e adequada para digerir a marcação para o cliente. No entanto, se eu tiver milhões de usuários, tentarei analisar o arquivo em suas máquinas - usando seus navegadores da Web para usar seu poder de processamento para evitar queimar nosso servidor. Portanto, a funcionalidade de análise pode estar no servidor ou no cliente, o que fizer mais sentido.

No entanto, se você não tiver certeza de onde guardar suas coisas, eu diria que as mantenha no servidor e sirva os resultados aos usuários - evite o código duplicado no servidor e no cliente.


Gostaria de saber por que a resposta recebeu uma votação negativa. Eu realmente aprecio se você compartilhar seus pensamentos também.
585 Mahdi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.