Единый код (для расчета цены) на JS и PHP

267
30 марта 2017, 21:12

На чем можно записать алгоритм, который должен отрабатывать единым образом в JS и в PHP (чтобы избежать дублирования кода)?

На сайте есть код, который рассчитывает стоимость заказа. Стоимость зависит от многих параметров, которые выбираются посетителем на сайте. Посетителю демонстрируется итоговая стоимость, которая рассчитывается с помощью JS. Потом параметры заказа отправляются на сервер.

На сервере (php) расчет стоимости по заданным параметрам происходит заново, для оформления заказа и записи в БД.

Получается дублирование кода - один и тот же алгоритм реализован и на JS, и на PHP. При изменении приходится вносить правки и туда, и туда. Это проблема.

Получать стоимость с сервера через AJAX во время изменения параметров пользователем нельзя, так как это происходит несколько раз в секунду (посетитель перетаскивает ползунок и в зависимости от его положения изменяется стоимость).

Вопрос в том, как записать этот алгоритм расчета в коде, едином и для JS и для PHP. Я уже думал использовать v8js, но на хостингах такое пока не поддерживается.

Что еще можно попробовать для описания алгоритма, чтобы это можно было выполнять и в PHP, и в JS без изменений?

Answer 1

Решение "в обход" — выкидывание реализации на JS

"Каноническая" реализация на сервере однозначно должна быть, так что выкинуть можно только если реализацию на JS, вместо неё получать результат с сервера.

Решение "в лоб" — язык над обоими

Мне известен ровно один язык, способный собираться и в JS, и в PHP — Haxe. Но это добавление в проект ещё одного языка. Стоит ли оно того?

Решение "боком" — преобразовать одну в другую

Если алгоритм использует совсем мало фич языка, преобразовать одно в другое может быть возможно даже регулярными выражениями. Тут народ Паскаль в Си переводит препроцессором, может и у вас получится. Но этот костыль, скорее всего, будет одноразовым и после сколько-нибудь существенных правок потребует доработки. Повезёт ещё, если сообщит о проблемах преобразования (хотя бы падением результата), а не просто по-тихому поведёт себя иначе.

Answer 2

Ну если захотеть извратиться, то можно замутить что-нибудь такое:

var calculate = (function () {
  var $q, $res;
  return function calculate //<?php function calculate
    ($base, $percent, $n) {
      $res = $base;
      $percent = 1 + $percent / 100;
      for ($q=0; $q<$n; ++$q) {
        $res *= $percent;
      }
      return $res;
    }
  $q
  -->0;/*
})(); //*/

Впрочем, предварительно надо убедиться в поддержке браузерами комментария -->, который официально появляется только в ES6.

  • JS: https://jsfiddle.net/us9m5n3g/1/
  • PHP: http://ideone.com/ByU8Cs

PS: А вообще, Node.js :)

READ ALSO
Как добавить капчу в буфер на nodejs?

Как добавить капчу в буфер на nodejs?

вк дает мне ошибку с ссылкой на капчу - https://apivk

231
Как добавить текст из полей input в textarea?

Как добавить текст из полей input в textarea?

Столкнулся с проблемой вроде все просто, но что-то не получаетсяМой вариант:

320
Плагин TableSorter.js в WordPress

Плагин TableSorter.js в WordPress

Пытаюсь использовать плагин TableSorterjs в WordPress

234