【问题标题】:How do you synchronize server-side and client-side code?您如何同步服务器端和客户端代码?
【发布时间】:2009-12-15 18:28:24
【问题描述】:

我在软件工程中学到(和教授)的东西是代码重复是万恶之源。另一方面,我发现很难解释这个概念应该如何应用于 Web 应用程序的开发。

请允许我澄清一下...输入和数据验证可能是网络应用程序的重要组成部分。有时这种验证可能非常复杂。例如,我在一个拼图编辑器上工作,验证包括检查操作或移动是否有效。然后必须检查重要的规则。

当然,验证必须在服务器端完成,以确保存储数据的一致性和质量。但是,必须在客户端进行验证以确保流畅的用户体验。

在大多数情况下,客户端和服务器端代码是用不同的语言(即 javascript/Python)编写的,因此验证代码必须编写两次。然而,在我对 GWT/Java(双方都使用 Java)的唯一经验中,我发现大部分验证代码都可以重用。这似乎让一切变得更容易:维护、重构、调试......

所以我的问题是:在客户端和服务器端语言不同的项目中,您如何管理与代码重复相关的问题?

【问题讨论】:

标签: javascript gwt client-server


【解决方案1】:

我通常处理此问题的方式是在服务器端编写验证代码并通过 Web 方法(在 .NET 中,大多数其他语言中存在类似功能)公开它,以便可以从 javascript 调用它。因此,您有一个方法可以从客户端同步和异步调用,也可以从服务器端调用。这并不适用于所有情况,但到目前为止对我来说效果很好。

【讨论】:

  • 验证服务?有道理,但是当目标是拥有交互式 UI 时,网络延迟可能使其不切实际。
  • 这取决于你如何处理它。如果您在后台进行异步调用,您可以很好地突出显示无效区域。如果您希望进行同步调用,请确保它们是轻量级的,这应该不是问题。如果您降低有效负载,HTTP 调用的速度之快令人惊叹。
  • 这是真的,除非你有一个糟糕的连接无论出于什么原因(例如手机边缘网络)。总会有高延迟的情况。感觉如果你想让它真正响应,你必须有客户端代码。
  • 同意。当我谈到“并非在所有情况下都适用”时,参差不齐的网络连接和低带宽连接将是您需要提出不同解决方案的一些情况。但在一般情况下,这通常是我采取的方法,直到我有理由偏离。
【解决方案2】:

通常情况下,很难避免重复生成的代码,但一种常见的方法是使用代码生成器来构建服务器端或客户端代码,这样您只需编写其中的一半。最流行的方法是编写服务器端通用程序,然后让代码生成器为您构建 JavaScript 代码。例如,我们在我公司使用的语言是 Coldfusion,Form-o-matic 为我们解决了这个问题。人们也从相反的方向通过编写可以在服务器端执行的 JavaScript 来解决这个问题。我会寻找一个框架来为你做这件事。

【讨论】:

  • 谢谢。这对回答我的问题大有帮助。所以 GWT,被视为代码生成器,本质上是朝着同一个方向发展的吗?您所指的代码生成器中是否有任何具有成熟编程语言的灵活性和强大功能的代码生成器? (为了进行基于非表单的验证,就像我描述的那样。)
  • 我认为 GWT 是我见过的最远的之一,因为您编写的客户端代码几乎为零。我根本没有尝试过它,但我认为唯一能够提供可以在客户端和服务器端执行代码的完全成熟的编程语言是允许 JavaScript 在服务器上运行的框架。我确信那里仍然存在限制,但目标是只编写 JavaScipt 并且它可以在任何地方执行。就个人而言,我对 JavaScript 的喜爱程度不足以做到这一点,但如果你愿意,你可以走这条路。
  • 在此处查看维基百科页面,了解朝这个方向发展的相同项目:en.wikipedia.org/wiki/Server-side_JavaScript
  • 感谢维基百科页面。很有用。您确实在 GWT 中编写客户端代码,简单地说,您用 Java 编写它,然后从那里生成 javascript。因此,您可以获取部分代码并在客户端(在 javascript 生成之后)和服务器端(在 servlet 内)运行它们。
【解决方案3】:

一个可能的解决方案是使用 DSL 在验证描述文件(以 XML 或任何其他方式)中抽象实际验证。这样,您只需要在客户端和服务器语言中实现验证引擎,并将验证基于相同的描述文件。

【讨论】:

  • 我的印象是“验证”通常被认为是比我想象的更具体的东西。当然,验证可以是检查文本字段的内容。不过,更一般地说,这是为了确保模型的修改方式在其当前状态下是合法的。在我看来,这种“验证”的定义使得使用除编程语言之外的任何东西都很难做到这一点。
猜你喜欢
  • 1970-01-01
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多