Моя команда разрабатывает финансовое приложение на основе WEB, и с коллегой возник спор о том, как сохранить расчеты - чисто бэкэнд или некоторые из них тоже?
Краткое объяснение: Мы используем Java (ZK, Spring) для front-end и Progress 4gl для back-end. Расчеты, которые включают в себя некоторую хардкорную математику и данные из базы данных, хранятся в бэк-энде, поэтому я не говорю о них. Я говорю о ситуации, когда пользователь вводит значение X, затем оно добавляется к значению Y (показано на экране), и результат отображается в поле Z. Я имею в виду чистые и простые операции jQuery-ish.
Итак, что было бы лучшей практикой здесь:
1) Добавить значения с помощью JavaScript, который избавляет от перехода в бэкэнд и обратно, а затем проверять их в бэкэнде «при сохранении»?
2) Храните всю бизнес-логику в одном месте - поэтому перенесите значения в бэкэнд и сделайте там расчеты?
3) Делать расчеты во внешнем интерфейсе; затем отправить данные в бэкэнд, проверить их там, выполнить вычисления снова и только, если результаты верны и равны, отобразить их пользователю?
4) Что-то еще?
Примечание. Мы выполняем некоторую базовую проверку в Java, но большая ее часть все еще находится в бэк-энде, как и вся остальная бизнес-логика.
Увеличение объема данных, которые будут отправлены путем пересчета всего в бэкэнде, не будет проблемой (небольшой размер XML; серверы и пропускная способность будут выдерживать увеличение количества операций, выполняемых пользователями).
Ответы:
Как всегда, такие решения предполагают компромисс между различными целями, некоторые из которых противоречат друг другу.
Эффективность предполагает, что вы выполняете вычисления во внешнем интерфейсе - и потому, что таким образом компьютер пользователя потребляет больше энергии, а ваш сервер потребляет меньше, а также потому, что пользователь видит более быструю обратную связь, что улучшает взаимодействие с пользователем.
Безопасность требует, чтобы любые операции с изменением состояния не могли полагаться на данные, проверяемые или вычисляемые на клиентском компьютере, поскольку клиентский компьютер может находиться под контролем злоумышленника. Следовательно, вы должны проверять все, что поступает из ненадежных источников на стороне сервера.
Эффективность программирования и ремонтопригодность предполагают, что вы не должны делать одни и те же вычисления дважды из-за потраченных усилий.
Внешне это звучит так, как будто все должно быть сделано на стороне сервера, но это не всегда так. Если вы можете легко поддерживать дублированный код (например, автоматически генерируя валидатор javascript из вашего валидатора Java на стороне сервера), то повторение вычислений может быть хорошим решением. Если все эти данные не важны, например, если пользователь может обманывать только себя, а не вас, если они манипулируют значениями, то проверка на стороне сервера не требуется. Если в вашем времени отклика преобладают совершенно разные узкие места, так что задержка прохождения сигнала туда и обратно не ощутима, то соображения UX не являются решающими и т. Д. Поэтому вы должны учитывать, насколько сильным является каждое из этих давлений в вашей ситуации, и принимать соответствующие решения. ,
источник
Programming efficiency and maintainability suggests that you shouldn't do the same computation twice because of the wasted effort.
это не правильно, потому что [1] Проверка во внешнем интерфейсе может обеспечить быструю обратную связь с пользователем для внесения исправлений, если это необходимо. [2] Валидация в бэк-энде не так отзывчива и, следовательно, не дает пользователю лучшей возможности внести исправления. Пользователь должен будет подождать и повторить больше работы. Поэтому я думаю, что две проверки не совсем одинаковы.Существуют веские причины для выполнения расчетов в бэкэнде
Моя рекомендация
источник