Mój zespół pracuje nad aplikacją finansową opartą na WEBie, a kolega z koleżanki spierał się, gdzie przechowywać obliczenia - tylko w back-endie, czy też w front-endie?
Krótkie wyjaśnienie: Używamy Java (ZK, Spring) dla frontonu i Progress 4gl dla back-endu. Obliczenia, które obejmują niektóre trudne obliczenia matematyczne i dane z bazy danych, są przechowywane w zapleczu, więc nie mówię o nich. Mówię o sytuacji, w której użytkownik wprowadza wartość X, a następnie dodaje się ją do wartości Y (pokazanej na ekranie), a wynik jest wyświetlany w polu Z. Czyste i proste operacje jQuery, to znaczy.
Więc jaka byłaby najlepsza praktyka tutaj:
1) Dodać wartości za pomocą JavaScript, które oszczędzają przechodzenie do zaplecza i wstecz, a następnie zweryfikować je na zapleczu „przy zapisywaniu”?
2) Zachowaj całą logikę biznesową w tym samym miejscu - dlatego przenieś wartości do zaplecza i wykonaj tam obliczenia?
3) Wykonaj obliczenia w interfejsie; następnie wyślij dane do zaplecza, zweryfikuj je tam, wykonaj obliczenia ponownie i tylko jeśli wyniki są prawidłowe i równe, wyświetl je użytkownikowi?
4) Coś jeszcze?
Uwaga: Przeprowadzamy podstawowe sprawdzanie poprawności w Javie, ale większość z nich wciąż znajduje się w zapleczu, podobnie jak cała logika biznesowa.
Zwiększenie ilości danych, które zostałyby wysłane przez ponowne obliczenie wszystkiego w zapleczu, nie stanowiłoby problemu (mały rozmiar XML; serwery i przepustowość wytrzymałyby zwiększoną liczbę operacji wykonywanych przez użytkowników).
Odpowiedzi:
Jak zawsze, takie decyzje wiążą się z kompromisem między różnymi celami, z których niektóre są ze sobą sprzeczne.
Wydajność sugeruje wykonanie obliczeń w interfejsie - zarówno dlatego, że komputer użytkownika zużywa więcej energii, a serwer zużywa mniej, a także dlatego, że użytkownik widzi szybsze informacje zwrotne, co poprawia komfort użytkowania.
Bezpieczeństwo wymaga, aby wszelkie operacje zmieniające stan nie mogły polegać na sprawdzaniu lub obliczaniu danych na komputerze klienckim, ponieważ komputer kliencki może być pod kontrolą złośliwego atakującego. Dlatego musisz sprawdzić wszystko, co pochodzi z niezaufanych źródeł po stronie serwera.
Wydajność i łatwość programowania sugerują, że nie powinieneś wykonywać tego samego obliczenia dwa razy z powodu zmarnowanego wysiłku.
Na pozór brzmi to tak, jakby wszystko trzeba było zrobić po stronie serwera, ale nie zawsze tak jest. Jeśli możesz łatwo utrzymać zduplikowany kod (np. Automatycznie generując sprawdzanie javascript z walidatora Java po stronie serwera), powtórzenie obliczeń może być dobrym rozwiązaniem. Jeśli wszystkie dane są nieistotne, np. Jeśli użytkownik może oszukiwać tylko siebie, a nie ciebie, jeśli manipuluje wartościami, weryfikacja po stronie serwera nie jest konieczna. Jeśli twój czas reakcji jest zdominowany przez zupełnie inne wąskie gardła, tak że opóźnienie w obie strony nie jest odczuwalne, to względy UX nie są decydujące itp. Dlatego musisz rozważyć, jak silne jest każde z tych nacisków w twojej sytuacji i odpowiednio zdecydować .
źródło
Programming efficiency and maintainability suggests that you shouldn't do the same computation twice because of the wasted effort.
to nie jest poprawne, ponieważ [1] Walidacja w interfejsie może dostarczyć użytkownikowi szybkiej informacji zwrotnej, aby w razie potrzeby wprowadzić poprawki. [2] Walidacja w back-endie nie jest tak responsywna, a zatem nie zapewnia użytkownikowi najlepszej okazji do wprowadzenia poprawek. Użytkownik musiałby poczekać i powtórzyć więcej pracy. Myślę więc, że te dwie walidacje nie są dokładnie takie same.Istnieją silne powody, aby wykonywać obliczenia w backend
Moja rekomendacja
źródło