Как избежать дублирования формулы в Javascript и PHP? - PullRequest
2 голосов
/ 16 сентября 2011

В настоящее время я пишу веб-приложение на HTML5 / Javascript и PHP.

Некоторым сотрудникам компании потребуется использовать его для ввода своего графика работы.Приложение рассчитает в режиме реального времени (используя Javascript) некоторую сложную юридическую информацию и отобразит результат в нижней части страницы.Когда он закончил, пользователь нажимает кнопку «Сохранить», и все отправляется в базу данных.

Проблема в том, что мне нужно, чтобы и пользователь видел результат в реальном времени, и менеджеры, чтобы получить тот же результатиз того, что было сохранено в базе данных.Мне также нужно поддержать случай, когда у пользователя отключен Javascript.Другими словами, мне нужно сделать одно и то же исчисление как в Javascript, так и в PHP.

Чтобы усложнить задачу, формула очень сложна и будет часто меняться (каждый месяц или около того), поэтому я бы хотелчтобы избежать поддержания двух разных версий.Тестирование уже будет достаточно сложным.

Также я бы хотел, чтобы AJAX не запрашивал вывод у сервера, потому что:

  • пользователь часто строит свое расписание согласнорезультат вычисления в реальном времени, поэтому даже задержка в 1-2 секунды действительно может раздражать его
  • , если возможно, я должен поддерживать автономные функции HTML5, чтобы пользователь мог загрузить приложение на свой мобильный телефонзаполнить его расписание в автономном режиме, а затем загрузить его, когда он-лайн

На данный момент единственное решение, которое я нашел, - это написать формулу без учета языка, а затем каким-то образом превратить ее вPHP-код и JavaScript-код, но это не просто.

Ответы [ 3 ]

4 голосов
/ 16 сентября 2011

Похоже, у вас есть два основных подхода:

  1. Вы можете написать независимую от языка формулу (в базе данных или конфигурационном файле, поскольку она часто меняется) и два кода.генераторы (Javascript, PHP).Это на самом деле не так страшно, как кажется, если вы правильно выбираете входной формат и подразумеваете формулу, а не произвольные вычисления.

  2. Вы можете использовать серверный JavaScript,и напишите формулу один раз в JavaScript.В Википедии есть сравнение серверных реализаций JavaScript .Есть даже интерпретаторы JavaScript, написанные на PHP, включая, по крайней мере, phpjs и J4P5 .

0 голосов
/ 19 сентября 2011

Этим утром у меня появилась идея попробовать XSLT для расчета. Это действительно интересно, потому что он поддерживается как Javascript, так и PHP, это что-то надежное (в отличие от генератора кода, который я должен был бы написать сам), и уместное, поскольку входные данные уже были в XML.

Пример входных данных:

<schedule>
  <element start="2011-19-09 08:00:00" end="2011-19-09 17:00:00" type="work" />
</schedule>

Пример XSLT (написанный наизусть, может не работать):

<xsl:stylesheet>
  <xsl:template match="/">
     <output>
       <out name="totalWorkHour"><xsl:value-of select="sum(/element[@type='work'](@end-@start))" /></out>
     </output>
  </xsl:template>
</xsl:stylesheet>

Я попытаюсь все закодировать с помощью XSLT и оставлю это решение, если мне удастся это сделать.

0 голосов
/ 16 сентября 2011

Сохранение данных с использованием методов хранения, не зависящих от языка, и интерпретационных преобразований - не первые мысли, которые приходят на ум, когда упоминается термин «в реальном времени». Это очень возможно, но, как правило, гораздо сложнее и требует больше времени для разработки бесконечно масштабируемого и легко обслуживаемого программного обеспечения.

Лично я оцениваю стоимость по сравнению с выгодами, связанными с каждым известным решением, и выбираю подход, который, в первую очередь, приносит пользу конечному пользователю и соответствует или превосходит ключевые целевые результаты. После того как я принял решение, удовлетворяющее ожидания основных заинтересованных сторон, моя работа заключается в том, чтобы спроектировать и разработать наиболее масштабируемое и поддерживаемое решение, насколько это возможно, в рамках этих ожиданий.

Основываясь на предоставленных вами деталях, я бы абсолютно написал уравнения, используя нативный JavaScript и PHP для оптимальной производительности. Если спецификации программного обеспечения буквально (не в переносном смысле) обозначают необходимость обмена данными в реальном времени, я бы тогда обеспечил это путем реализации WebSockets , в противном случае длительного вытягивания будет достаточно .

Обратите внимание: Не все веб-браузеры поддерживают веб-сокеты, что может потребовать от конечных пользователей соответствия поддерживаемого веб-браузера . Эту загадку можно избежать, используя плавное переключение на стороне клиента (или вообще), используя что-то вроде Socket.IO .

...