如何同步服务器端和客户端代码?

8
我在软件工程中学到(也在教授)的一件事情是,代码重复是万恶之源。但另一方面,我发现很难解释这个概念应该如何应用于Web应用程序的开发。
请允许我澄清一下... 输入和数据验证可能是Web应用程序的重要组成部分。有时,这种验证可能非常复杂。例如,我曾经参与开发拼图编辑器,验证需要检查操作或移动是否有效。然后必须检查非平凡规则。
自然而然地,必须在服务器端进行验证,以确保存储的数据的一致性和质量。但必须在客户端进行验证,以确保用户体验顺畅。
在大多数情况下,客户端和服务器端的代码是用不同的语言编写的(即JavaScript / Python),因此验证代码必须编写两次。但在我使用GWT / Java(Java两端)的唯一经验中,我发现大部分验证代码可以重用。这似乎使一切变得更容易:维护、重构、调试等等。
所以我的问题是:在客户端和服务器端语言不同的项目中,您如何管理与代码重复相关的问题?

2
关于验证,请参见https://dev59.com/y0XRa4cB1Zd3GeqPohDs和https://dev59.com/RHRA5IYBdhLWcg3w8SeJ。 - Roatin Marth
2
谢谢,非常相关的帖子,我不知道怎么错过了。 - Philippe Beaudoin
3个回答

4
我通常处理这个问题的方法是在服务器端编写验证代码,并通过 web 方法(在 .NET 中,大多数其他语言也具有类似的功能)公开它,以便可以从 JavaScript 中调用。因此,您拥有一个单一的方法,可以从客户端同步和异步地调用,也可以从服务器端调用。这不适用于每种情况,但到目前为止,它对我非常有效。

1
一个验证服务?听起来很有道理,但是当目标是拥有交互式用户界面时,网络延迟可能会使其不切实际。 - Philippe Beaudoin
2
这取决于你如何处理它。如果你在后台进行异步调用,你可以非常好地突出显示无效的区域。如果你想进行同步调用,只需确保它们轻量级,就不应该有问题。如果你能保持负载较低,HTTP 调用的速度会非常快,这真是太神奇了。 - Brian Hasden
1
这是正确的,除非由于某种原因(例如,手机边缘网络)您的连接质量很差。总会存在高延迟的情况。如果您希望它真正响应快速,似乎必须使用客户端代码。 - Bialecki
同意。当我提到“并非适用于每种情况”时,网络连接不稳定和低带宽连接将是其中一些需要找到不同解决方案的情况。然而,在一般情况下,这通常是我采取的方法,除非有理由偏离这个方法。 - Brian Hasden

3
通常情况下,很难避免生成的代码重复,但一种常见的方法是使用代码生成器构建服务器端或客户端代码,这样你只需要编写其中的一半。最流行的方法是先编写服务器端的公共部分,然后让代码生成器为你构建JavaScript代码。例如,在我们公司使用的语言是Coldfusion,Form-o-matic就解决了这个问题。人们也尝试从相反的方向解决这个问题,通过编写可以在服务器端执行的JavaScript。我建议寻找一个能够为你完成这项任务的框架。

谢谢。这对回答我的问题有很大帮助。因此,GWT作为代码生成器,基本上是朝着同样的方向发展吗?您提到的任何代码生成器中是否有像完整编程语言一样灵活和强大的功能?(为了进行非表单验证,就像我所描述的那样。) - Philippe Beaudoin
我认为GWT是我见过的最先进的之一,因为你几乎不需要编写客户端代码。虽然我没有进行过任何实验,但我认为唯一能提供完整的编程语言,可以在客户端和服务器端都执行代码的框架就是允许JavaScript在服务器上运行的框架。我相信仍然存在一些限制,但目标是只编写JavaScript,并且它可以在任何地方执行。个人而言,我不太喜欢JavaScript到足以这样做,但如果您想要,您可以选择这条路线。 - Bialecki
1
请查看维基百科页面,了解已经朝着这个方向发展的同类项目:http://en.wikipedia.org/wiki/Server-side_JavaScript。 - Bialecki
感谢提供维基百科页面。非常有用。在GWT中编写客户端代码非常简单,您只需要使用Java编写代码,然后通过GWT生成相应的JavaScript代码。因此,您可以将代码的某些部分同时运行于客户端(在JavaScript生成后)和服务器端(在Servlet内部)。 - Philippe Beaudoin

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

我有这样的印象,即“验证”通常被认为比我想象的更具体。当然,验证可以是关于检查文本字段内容的。然而,更一般地说,它是确保在给定其当前状态的情况下修改模型的方式是合法的。在我看来,“验证”的这个定义使得使用编程语言以外的任何东西都很难实现。 - Philippe Beaudoin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接