Quando é apropriado fazer cálculos no front-end?

15

Minha equipe está desenvolvendo um aplicativo de finanças baseado na WEB e houve uma discussão com um colega sobre como manter os cálculos - apenas no back-end ou manter alguns no front-end também?

Breve explicação: Estamos usando Java (ZK, Spring) para front-end e Progress 4gl para back-end. Cálculos que envolvem matemática e & os dados do banco de dados são mantidos no back-end, então não estou falando sobre eles. Estou falando sobre a situação em que o usuário insere o valor X, ele é então adicionado ao valor Y (mostrado na tela) e o resultado é mostrado no campo Z. Operações jQuery-ish puras e simples, quero dizer.

Então, qual seria a melhor prática aqui:

1) Adicionar valores com JavaScript que salvem de ir para o back-end e voltar e, em seguida, validá-los no back-end "on save"?

2) Mantenha toda a lógica de negócios no mesmo lugar - portanto, traga os valores para o back-end e faça os cálculos lá?

3) Faça os cálculos no front-end; em seguida, enviar dados para o back-end, validá-los lá, fazer os cálculos novamente e somente se os resultados forem válidos e iguais, exibi-los para o usuário?

4) Algo mais?

Observação: fazemos algumas validações básicas em Java, mas a maioria ainda está no back-end como toda a outra lógica de negócios.

O aumento de dados que seria enviado ao recalcular tudo em um back-end não seria um problema (tamanho pequeno de XML; servidores e largura de banda suportariam o aumento da quantidade de operações feitas pelos usuários).

    
por IgnasK 04.08.2014 / 13:38
fonte

2 respostas

32

Como sempre, tais decisões envolvem um trade-off entre diferentes objetivos, alguns dos quais conflitam entre si.

  • A eficiência sugeriria que você realizasse cálculos no front-end - tanto porque o computador do usuário usa mais energia e seu servidor usa menos, e porque o usuário vê um feedback mais rápido, o que melhora a experiência do usuário. / p>

  • A segurança exige que as operações de alteração de estado não possam depender de dados verificados ou calculados no computador cliente, porque o computador cliente pode estar sob o controle de um invasor mal-intencionado. Portanto, você deve validar qualquer coisa que venha de fontes não confiáveis do lado do servidor.

  • A eficiência de programação e a manutenção sugerem que você não deve fazer o mesmo cálculo duas vezes devido ao esforço desperdiçado.

Superficialmente isso soa como se tudo tivesse que ser feito no lado do servidor, mas nem sempre é o caso. Se você puder manter facilmente o código duplicado (por exemplo, gerando automaticamente um validador de javascript do seu validador de Java do lado do servidor), a repetição da computação pode ser uma boa solução. Se os dados envolvidos forem todos sem importância, por ex. se o usuário puder enganar apenas a si mesmo e não você, se manipular valores, a validação do lado do servidor não será necessária. Se o seu tempo de resposta for dominado por gargalos completamente diferentes para que um atraso de ida e volta não seja perceptível, as considerações de UX não serão decisivas, etc. Portanto, você deve considerar quão strong cada uma dessas pressões é na sua situação e decida de acordo.

    
por 04.08.2014 / 13:46
fonte
11

Existem strongs razões para fazer cálculos no backend

  • A lógica de negócios não pertence à camada de apresentação
  • A lógica de negócios em JavaScript representa uma ameaça
  • Você assume que há um front-end - > Uma relação de back-end que nem sempre é verdadeira , back-ends deve ser pensada como sendo capaz ou servir mais de uma aplicação de front-end, assim você não pode assumir nada.
  • Se os cálculos usam uma grande quantidade de dados, não seria eficiente mantê-los no front-end
  • Se os cálculos usarem o banco de dados, você não poderá replicá-lo no front end

Minha recomendação

  • O banco de dados deve impor o máximo possível de regras de negócios no modelo, incluindo chaves estrangeiras, chaves primárias, restrições de verificação e acionadores
  • A camada de negócios deve lançar exceções quando as regras de negócios não forem atendidas (porque o banco de dados retornou um erro ou porque a própria camada de negócios validou os dados)
  • Se e somente se o tempo de resposta for inaceitável, faça validações ou pré-processamentos usando o Ajax (o trabalho não será realmente feito em JavaScript, isso será feito no backend sem precisar recarregar a página)
  • Você pode fazer uma validação simples em JavaScript, como não permitir um valor vazio ou valores muito longos ou fora do intervalo (para o último, talvez você queira gerar os intervalos no back-end)
por 04.08.2014 / 14:38
fonte