3

我知道可以使用验证器来检查应用程序表示层中的数据输入(例如,正则表达式、必填字段等),并显示一条消息和/或必填标记图标。数据验证一般属于业务层。如何避免对我收集的数据维护两组验证?

编辑:我知道演示验证很好,它会通知用户,而且它不是万无一失的。事实仍然存在,不是吗,我在两个地方有效地检查了同一件事?

4

5 回答 5

5

我不认为客户端(表示层)验证是实际的、有用的验证;相反,它只是通知用户服务器端(业务层)验证将发现的任何错误。我认为它是一个用户界面组件,而不是一个实际的验证实用程序,因此,我不认为两者都违反 DRY。

编辑:是的,您正在执行相同的操作,但出于完全不同的原因。如果您的唯一目标是严格遵守 DRY,那么您不想两者都做。但是,通过同时执行这两种操作,虽然您可能正在执行相同的操作,但该操作的结果用于不同的目的(实际上是验证信息与通知用户问题),因此,两次执行相同的操作实际上会导致结果每次都有有用的信息。

于 2009-06-25T14:22:53.550 回答
5

是的,没有。

这取决于您的应用程序的体系结构。我们假设您正在构建一个 n 层应用程序,因为现在绝大多数应用程序都倾向于遵循该模型。

用户界面中的验证旨在向系统的最终用户提供即时反馈,以防止较低层中的功能首先在无效输入的情况下执行。例如,您甚至不想在没有用户名和密码的情况下尝试联系 Active Directory 服务器来尝试身份验证。此时的验证可以节省您在实例化对象、设置对象以及进行不必要的服务器往返以了解您可以通过简单的数据检查轻松判断的内容的处理时间。

类库中的验证是另一回事。在这里,您正在验证业务规则。虽然可以说用户界面中的验证和类库中的验证是相同的,但我倾向于不同意。业务规则验证往往要复杂得多。在这种情况下,您的规则可能更加细微,并且可能会检测到无法通过用户界面收集的内容。例如,您可以强制执行一条规则,即用户只有在类的所有属性都已正确初始化之后,并且只有当用户是特定用户组的成员时才能执行方法。或者,您可以指定只有在过去 24 小时内没有修改过的对象才可以修改。或者,您可以简单地指定字符串值不能为 null 或空。

然而,在我看来,正确设计的软件使用一种通用机制从 UI 和类库中强制执行 DRY(如果可能)。在大多数情况下,这是可能的。(在很多情况下,代码是如此琐碎,不值得。)

于 2009-06-25T14:56:23.700 回答
0

我认为在应用层进行良好的验证可以带来多种好处。1. 方便单元测试 2. 可以添加多个客户端,不用担心数据的一致性。

UI 验证可用作向最终用户提供快速响应时间的工具。

于 2009-06-25T14:25:44.587 回答
0

每个验证层都有不同的用途。用户界面验证用于丢弃错误输入。业务逻辑验证用于根据业务规则执行验证。

对于 UI 验证,您可以使用 RequiredFieldValidators 和 ASP.NET 框架中可用的其他验证器。对于业务验证,您可以创建验证对象的验证引擎。这可以通过使用自定义属性来完成。

这是一篇文章,它解释了如何使用自定义属性创建验证框架:

http://highoncoding.com/Articles/424_Creating_a_Domain_Object_Validation_Framework.aspx

于 2009-06-25T14:29:25.003 回答
0

跟进 Fredrik Mörk 的评论作为答案,因为我认为其他答案不太正确,这对这个问题很重要。

至少在可以绕过演示验证的上下文中,演示验证和业务验证正在做完全不同的事情。

业务验证保护应用程序。演示验证保护用户的时间,仅此而已。它们只是帮助用户产生有效输入的另一种工具,假设用户是善意的。演示验证不应该用来保护业务验证免于做额外的工作,因为它们不能被依赖,所以如果你尝试这样做,你真的只是在浪费精力。

因此,您的业务验证和演示验证可能看起来非常不同。对于业务验证,根据您的应用程序的复杂性/您在任何给定时间验证的范围,期望它们涵盖所有情况并保证无效输入是不可能的可能是合理的。

但是演示验证是一个移动的目标,因为用户体验是一个移动的目标。您几乎总是可以在现有的基础上改善用户体验,因此这是一个收益递减以及您想要投入多少努力的问题。

因此,在回答您的问题时,如果您想要良好的演示验证,您最终可能会复制业务逻辑的某些方面 - 而且您最终可能会做更多的事情。但你不会两次做同样的事情。您已经做了两件事 - 保护您的应用程序免受恶意攻击者的侵害,并为善意攻击者提供帮助以更轻松地使用您的系统。在无法依赖表示层的情况下,没有办法减少这种情况,以便您只执行一次“请只输入一个数字”之类的任务。

这是一个观点问题。您可以将其视为“我正在检查输入是否为数字两次”,或者您可以认为“我已经保证我没有得到数字,并且我已经确保用户尽早意识到他们可能只应该输入一个数字”。这是两件事,而不是一件事,我强烈推荐这种心理方法。这将有助于牢记两种不同验证的目的,这将使您的验证更好。

于 2020-11-16T01:18:44.777 回答