На чем можно записать алгоритм, который должен отрабатывать единым образом в JS и в PHP (чтобы избежать дублирования кода)?
На сайте есть код, который рассчитывает стоимость заказа. Стоимость зависит от многих параметров, которые выбираются посетителем на сайте. Посетителю демонстрируется итоговая стоимость, которая рассчитывается с помощью JS. Потом параметры заказа отправляются на сервер.
На сервере (php) расчет стоимости по заданным параметрам происходит заново, для оформления заказа и записи в БД.
Получается дублирование кода - один и тот же алгоритм реализован и на JS, и на PHP. При изменении приходится вносить правки и туда, и туда. Это проблема.
Получать стоимость с сервера через AJAX во время изменения параметров пользователем нельзя, так как это происходит несколько раз в секунду (посетитель перетаскивает ползунок и в зависимости от его положения изменяется стоимость).
Вопрос в том, как записать этот алгоритм расчета в коде, едином и для JS и для PHP. Я уже думал использовать v8js, но на хостингах такое пока не поддерживается.
Что еще можно попробовать для описания алгоритма, чтобы это можно было выполнять и в PHP, и в JS без изменений?
Ответ
Решение "в обход" — выкидывание реализации на JS
"Каноническая" реализация на сервере однозначно должна быть, так что выкинуть можно только если реализацию на JS, вместо неё получать результат с сервера.
Решение "в лоб" — язык над обоими
Мне известен ровно один язык, способный собираться и в JS, и в PHP — Haxe. Но это добавление в проект ещё одного языка. Стоит ли оно того?
Решение "боком" — преобразовать одну в другую
Если алгоритм использует совсем мало фич языка, преобразовать одно в другое может быть возможно даже регулярными выражениями. Тут народ Паскаль в Си переводит препроцессором, может и у вас получится. Но этот костыль, скорее всего, будет одноразовым и после сколько-нибудь существенных правок потребует доработки. Повезёт ещё, если сообщит о проблемах преобразования (хотя бы падением результата), а не просто по-тихому поведёт себя иначе.
Комментариев нет:
Отправить комментарий