По мере роста потребностей веб-приложений я обнаружил, что пишу больше и больше веб-приложений, управляемых API. Я использую фреймворки, такие как AngularJS, для создания богатых веб-клиентов, которые общаются с этими API. В настоящее время я использую PHP (Lumen или Laravel) для серверной части /API.
Проблема заключается в том, что я часто повторяю бизнес-логику между клиентом и сервером.
Когда я говорю бизнес-логику, я имею в виду следующие правила для формы заказа:
- Вы можете купить X, если вы покупаете Y.
- Вы не можете купить Y, если у вас есть Z.
- Если вы купите 10 из них, вы получите скидку 10%.
- Высота x Ширина x Глубина x Стоимость = Окончательная стоимость.
- Высота должна быть от 10 до 20, если ваша ширина больше 5.
- и т.д.
Чтобы сделать это приложение быстрым и быстрым, логика вычислений (наряду с другой бизнес-логикой) выполняется на стороне клиента. Поскольку мы не должны доверять клиенту, я затем повторно проверяю эти номера на стороне сервера. Эта логика может стать довольно сложной и написание этой сложной логики в обоих местах кажется опасным.
У меня есть три решения:
-
Сделать все, что требует бизнес-логики, сделать аякс-вызов API. Вся бизнес-логика будет жить в одном месте и может быть проверена один раз. Это может быть медленным, так как клиенту придется ждать каждого изменения, которое они вносят в форму заказа, для получения обновленных значений и результатов. Благодаря этому очень быстрый API. Основной недостаток заключается в том, что это может не сработать, когда пользователи плохо подключены (мобильные устройства).
-
Напишите бизнес-логику на стороне клиента И на стороне сервера. Клиент получает мгновенную обратную связь, поскольку они вносят изменения в форму, и мы проверяем все данные после их отправки на сервер. Недостатком здесь является то, что мы должны дублировать всю бизнес-логику и тестировать обе стороны. Это, безусловно, больше работы и сделает будущую работу хрупкой.
-
Доверяйте клиенту!?! Напишите всю бизнес-логику на стороне клиента и предположите, что они не вмешиваются в данные. В моем текущем сценарии я работаю над создателем цитат, который всегда будет проверяться человеком, поэтому, возможно, это действительно нормально.
Честно говоря, я не доволен ни одним из решений, поэтому я обращаюсь к сообществу за советом. Я хотел бы услышать ваши мнения или подходы к этой проблеме!