有没有最佳实践方法来验证用户输入?

dyl*_*ert 10 c# input winforms

有没有最佳实践方法来验证用户输入

实际问题:

用户在窗口中给出某些输入.当他完成这些输入后,他可以点击"创建".现在,应显示一条弹出消息,其中包含所有无效输入.如果没有无效输入,那么继续.

我可以在Form类中轻松完成此操作.但我记得在设置属性中验证输入的一些最佳实践方法.问题是我已经创建了该类的实例(否则,无法设置属性;))如果我以这种方式验证.这不应该发生,除非输入有效,否则不会创建类的实例.

我打算创建一个ErrorMessages类,其中包含一个列表,我可以将所有errorMessages放入其中.每次给出无效输入时,都会向errorMessages列表添加一条新消息.因此,如果用户单击"创建"按钮,则会显示列表中的所有消息.这是处理事情的好方法吗?

那么有最好的练习方式吗?任何提供此类解决方案的设计模式?

编辑:这是一项学校任务.因此有不合逻辑的要求.单击"创建"时,我必须显示所有无效输入.我想从Form类中做到这一点.(因此即使没有GUI,验证也能正常工作,此时我甚至还没有创建GUI).首先确保我的功能正常工作;).我想保持我的代码干净,抽象和OOP.那么我应该如何显示我的错误消息?

Cod*_*ray 8

我打算创建一个ErrorMessages类,其中包含一个列表,我可以将所有errorMessages放入其中.每次给出无效输入时,都会向errorMessages列表添加一条新消息.因此,如果用户单击"创建"按钮,则会显示列表中的所有消息.这是处理事情的好方法吗?

主观上,我认为提供用户输入的值无效的即时反馈会更好.这样,他们可以立即返回并修复它.

我想说的是,考虑一下.你提出的方法最终会给他们一个巨大的问题列表,这对用户不是很友好.此外,他们如何记住所有这些问题,以便能够一次又一个地修复它们?(提示:他们不是.)

相反,我建议使用ErrorProvider来显示相应控件旁边的任何错误.我在这里这里的答案中更多地谈到了这种方法.

当然,您仍然需要确保最终提交(单击确定/提交按钮)所有输入都有效,但那只是检查是否存在任何错误的简单情况.

我可以在Form类中轻松完成此操作.但我记得在设置属性中验证输入的一些最佳实践方法.

是的,这里的想法是封装.Form类应该只知道表单内容.不应该要求知道哪种输入对所有不同的控件都有效/无效.

相反,此验证逻辑应放在其他位置,例如存储数据的类中.该类将公开属性以获取和设置数据,并且在setter方法内部,它将验证数据.

这意味着您的表单所要做的就是在数据类上调用setter方法.表单不需要知道如何验证数据,甚至不知道数据的含义,因为数据类处理所有这些.

这不应该发生,除非输入有效,否则不会创建类的实例.

如果确实如此,则需要为该类提供一个构造函数,该构造函数接受所需的所有数据作为参数.然后,构造函数的主体将验证指定的数据,并在其中任何一个无效时抛出异常.该异常将阻止创建类,确保不存在包含无效数据的类的实例.

这样的类可能不会在所有的getter中都有setter方法.

但是,这在C#世界中是一种不寻常的要求(不管它在C++中是多么常见).通常,将验证代码放在setter中可以正常工作.

我的房产有一些私人制定者.所以它们只能在我的数据类的构造函数中设置.问题是,这似乎使我的验证不是eassy

为什么会改变什么呢?您仍然处理私有setter内部的验证.如果验证失败,则抛出异常.因为构造函数不处理异常,所以它继续从该方法冒出来到试图实例化该对象的代码.如果该代码想要处理异常(例如,向用户显示错误消息),则可以这样做.

当然,在无效输入的情况下抛出异常不一定是"最佳实践".原因是异常通常应该保留用于意外情况,并且用户搞砸并向您提供无效数据也是可以预期的.然而:

  1. 这是构造函数中用于数据验证的唯一选项,因为构造函数不能返回值.
  2. UI代码中的异常处理成本基本上可以忽略不计,因为现代计算机可以比用户感知屏幕上的更改更快地处理异常.