如何避免在Javascript和PHP中重复一个公式


How to avoid duplicating a formula in both Javascript and PHP?

我正在用HTML5/Javascript和PHP编写一个web应用程序。

公司的一些员工将需要使用它来输入他们的工作时间表。应用程序将实时计算(使用Javascript)一些复杂的法律信息,并在页面底部显示结果。当他完成后,用户点击"保存"按钮,所有内容都被发送到数据库。

问题是,我既需要用户实时查看输出,也需要管理人员从数据库中保存的内容中获得相同的输出。我还需要支持用户禁用Javascript的情况。换句话说,我需要在Javascript和PHP中进行相同的演算。

使事情变得更复杂的是,公式非常复杂并且会经常更改(每个月左右),所以我希望避免维护两个不同的版本。测试一个已经够难的了。

我还想避免AJAX向服务器请求输出,因为:

  • 用户通常会根据实时计算的结果建立自己的时间表,所以即使是1-2秒的延迟也会让他很恼火
  • 如果可能的话,我必须支持HTML5的离线功能,这样用户可以在手机上加载应用程序,在离线时填满它的时间表,然后在在线时上传

目前,我找到的唯一解决方案是以语言无关的方式编写公式,然后使用某种方式将其转换为PHP代码和JavaScript代码,但这并不简单。

听起来基本上有两种方法:

  1. 您可以编写一个独立于语言的公式(在数据库或配置文件中,因为它经常更改)和两个代码生成器(Javascript, PHP)。这实际上没有听起来那么可怕,只要你选择的输入格式是合理的,而且你实际上是指一个公式,而不是一些任意的计算。

  2. 您可以使用服务器端JavaScript,并在JavaScript中编写一次公式。Wikipedia有一个服务器端JavaScript实现的比较。甚至还有用PHP编写的JavaScript解释器,至少包括phpjs和J4P5。

使用与语言无关的存储技术和解释性转换来持久化数据并不是提到术语"实时"时首先想到的。这是非常可能的,但通常更具挑战性和耗时设计无限可扩展和易于维护的软件。

就我个人而言,我权衡与每个已知解决方案相关的成本与收益,并决定首先使最终用户受益并满足或超过关键目标可交付成果的方法。一旦我做出了满足主要涉众期望的决定,那么我的工作就是在这些期望的范围内设计和开发最具可扩展性和可维护性的解决方案。

根据您提供的细节,我绝对会使用原生JavaScript和PHP编写方程式以获得最佳性能。如果软件规范从字面上(不是比喻地)表示实时通信的必要性,那么我将通过实现WebSockets来提供这一点,否则长时间拉动就足够了。

请注意:并不是所有的Web浏览器都支持WebSockets,这可能需要最终用户遵守所支持的Web浏览器。可以通过使用Socket.IO之类的东西来采用无缝的客户端故障转移(或全部)来避免这个难题。

今天早上我产生了尝试使用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编写所有代码,如果我设法做到了,我将保留这个解决方案。

相关文章: