2009-12-15 159 views
8

我一直在软件工程中学习(和教授)的东西是代码重复是万恶之源。另一方面,我很难解释这个概念如何应用于Web应用程序的开发。如何同步服务器端和客户端代码?

请允许我澄清...输入&数据验证可以是Web应用程序的重要组成部分。有时候这种验证可能相当复杂。例如,我使用了一个拼图编辑器,验证包括检查操作或移动是否有效。不平凡的规则然后必须被检查。

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

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

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

+2

关于验证,请参阅http://stackoverflow.com/questions/39628/keeping-validation-logic-in-sync-between-server-and-client-sides和http://stackoverflow.com/questions/778726 /如何避免 - 服务器端和客户端的验证重复 –

+2

谢谢,非常相关的帖子,我不知何故错过了。 –

回答

3

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

+0

谢谢。这对回答我的问题有很大的帮助。所以GWT,作为一个代码生成器,本质上是一致的?您提到的任何代码生成器是否具有完善的编程语言的灵活性和强大功能? (为了做非基于表单的验证,就像我所描述的那样。) –

+0

我认为GWT是我见过的最远的一个,因为你写在零客户端代码旁边。我还没有尝试过,但我认为唯一能够提供完全成熟的编程语言的代码可以在客户端和服务器端执行,这是允许JavaScript在服务器上运行的框架。我确信那里仍然有限制,但是目标是除了JavaScipt之外什么都不写,它可以在任何地方执行。就个人而言,我不喜欢JavaScript来做到这一点,但如果你愿意,你可以走这条路。 – Bialecki

+1

查看维基百科页面,查看已经朝这个方向发展的相同项目:http://en.wikipedia.org/wiki/Server-side_JavaScript。 – Bialecki

4

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

+0

+1:具有实际意义。 – jldupont

+1

验证服务?有意义,但当目标是建立交互式用户界面时,网络延迟可能使其变得不切实际。 –

+2

这取决于你如何处理它。如果您在后台进行异步呼叫,您可以非常好地突出显示无效的区域。如果你想要进行同步呼叫,只要确保它们是轻量级的,它不应该是一个问题。如果您保持有效负载不变,那么如何快速进行HTTP调用真是太棒了。 –

0

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

+0

我感觉“验证”通常被认为是比我想象的更具体的东西。当然,验证可以关于检查文本字段的内容。但更一般的说,就是要确保模型的修改方式在目前的状态下是合法的。在我看来,“验证”的这个定义使它难以使用比编程语言更少的东西。 –