在程序中验证用户输入的位置?

dev*_*ium 2 architecture oop validation

假设我必须为一家小型诊所公司实施一项计划,该计划允许其用户(即医生)安排咨询,记录客户的病史等.因此,这可能是标准的3层应用程序:演示,控制器和数据层(将连接到数据库).

我看到3种可能性:

  1. 我的第一个想法是将验证代码放在域层中.但是我觉得那时我可能会想要检查A类,然后检查使用A的B,然后使用B等的C检查.另一方面,它很好,因为它很容易单元化 - 测试验证逻辑.

  2. 还有第二种思想,即尽可能快地验证用户输入的最佳位置,即可能在表示层(或在控制器中).一般来说,这似乎是一个好主意.如果在Controller上,它也可能很容易进行单元测试.它还允许人们切换视图或数据层,但仍然拥有一切正确.

  3. 尝试将最有效的逻辑放在数据库本身上.这似乎是一个好主意,因为它强制执行没有数据破坏数据库.我看到的问题是,如果我想使用不同的数据存储库,我将不得不再次为新的数据验证逻辑.例如,在域层具有这种逻辑就不会有这个问题.

你一般如何解决这个问题?

duf*_*ymo 9

正如您所指出的,验证数据的位置不止一个.

还有几个级别的验证:

  1. 正确的格式和类型; 存在所有必需值(例如,如果需要出生日期,请确保它出现并且是Date类型;如果它是String,请确保它符合预期的格式,例如'yyyy-MM-dd')
  2. 1级加"业务正确性":已完成的交易对您的业务规则有效(例如,"出生日期必须至少比今天早18年").

有一种思想流派认为你应该考虑所有这些:

  1. 验证客户端以确保为用户提供最佳体验.不要让他们等待往返服务器以找出问题所在.进行JavaScript验证,立即告诉他们1级有效性.
  2. 在服务器端再次验证,因为您的服务层可能没有在其前面的用户界面.绑定并验证进入服务层的所有值.
  3. 作为服务层中事务的一部分执行所有2级验证.从业务角度确保输入正确.
  4. 如果数据库由多个应用程序共享,则将业务逻辑放入约束,存储过程和触发器以确保数据完整性.

我不认为这些应该是"要么"决定.