【问题标题】:How to avoid duplicating a formula in both Javascript and PHP?如何避免在 Javascript 和 PHP 中重复公式?
【发布时间】:2011-09-15 20:48:08
【问题描述】:

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

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

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

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

另外我想避免 AJAX 向服务器询问输出,因为:

  • 用户经常会根据实时计算的结果来制定自己的日程安排,所以即使是 1-2 秒的延迟也会让他很烦
  • 如果可能的话,我必须支持 HTML5 的离线功能,这样用户就可以在手机上加载应用程序,离线时填写日程,在线时上传

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

【问题讨论】:

  • 回答标题,你不能;但这不是一件坏事恕我直言。

标签: php javascript web-applications code-duplication


【解决方案1】:

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

  1. 您可以编写一个与语言无关的公式(在数据库或配置文件中,因为它变化如此频繁)和两个代码生成器(Javascript、PHP)。这实际上并不像听起来那么可怕,只要您明智地选择输入格式并且您实际上是指一个公式,而不是一些任意计算。

  2. 您可以使用服务器端 JavaScript,并在 JavaScript 中编写一次公式。维基百科有一个comparrison of server-side JavaScript implementations。甚至还有用 PHP 编写的 JavaScript 解释器,至少包括 phpjsJ4P5

【讨论】:

  • 正如我所说的非常复杂(规范中有 15 页),我无法想象没有 if-while-for-etc 的情况下自己编写它。但是第二个解决方案看起来很有趣,我要检查一下
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多