Architecture 在哪里验证程序中的用户输入?

Architecture 在哪里验证程序中的用户输入?,architecture,oop,validation,Architecture,Oop,Validation,比如说,我必须为一家小型诊所公司实施一个程序,允许其用户(即医生)安排咨询、记录客户病历等。因此,这可能是标准的三层应用程序:演示、控制器和数据层(连接到数据库) 我认为有3种可能性: 我的第一个想法是将验证代码放在域层中。但我觉得我可能会对类A进行检查,然后对使用A的B进行相同的检查,然后对使用B的C进行检查,等等。另一方面,这很好,因为很容易对验证逻辑进行单元测试 还有第二种观点认为,验证用户输入的最佳位置是尽快,也就是说,可能在表示层(或控制器)上。总的来说,这似乎是个好主意。如果在控制器

比如说,我必须为一家小型诊所公司实施一个程序,允许其用户(即医生)安排咨询、记录客户病历等。因此,这可能是标准的三层应用程序:演示、控制器和数据层(连接到数据库)

我认为有3种可能性:

  • 我的第一个想法是将验证代码放在域层中。但我觉得我可能会对类A进行检查,然后对使用A的B进行相同的检查,然后对使用B的C进行检查,等等。另一方面,这很好,因为很容易对验证逻辑进行单元测试

  • 还有第二种观点认为,验证用户输入的最佳位置是尽快,也就是说,可能在表示层(或控制器)上。总的来说,这似乎是个好主意。如果在控制器上,可能也很容易进行单元测试。它还允许用户切换视图或数据层,但仍能保持一切正常

  • 尝试在数据库本身上放置尽可能多的验证逻辑。这似乎是个好主意,因为它强制要求没有数据会损坏数据库。我看到的问题是,如果我想使用不同的数据存储库,我将不得不为新的数据存储库再次验证数据逻辑。例如,在域层拥有这种逻辑就不会有这个问题


  • 您通常如何处理这个问题?

    正如您所指出的,验证数据的地方不止一个

    还有几个验证级别:

  • 正确的格式和类型;显示所有必需的值(例如,如果出生日期是必需的,请确保它出现并且是日期类型;如果它是字符串,请确保它符合预期的格式,如“yyy-MM-dd”)
  • 级别1加上“业务正确性”:完成的交易根据您的业务规则有效(例如,“出生日期必须至少比今天早十八年”)
  • 有一个学派说你应该考虑所有这些问题:

  • 在客户端进行验证,以确保为用户提供最佳体验。不要让他们等到往返服务器时才发现问题。将JavaScript验证放在适当的位置,立即告诉他们级别1的有效性
  • 在服务器端再次验证,因为您的服务层前面可能没有用户界面。绑定并验证进入服务层的所有值
  • 作为服务层事务的一部分,执行所有级别2验证。确保从业务角度来看输入是正确的
  • 如果数据库由多个应用程序共享,请将业务逻辑放入约束、存储过程和触发器中,以确保数据完整性
  • 我认为这些不应该是“非此即彼”的决定。

    不要混淆“何时”和“何地”

    “何时”应尽可能早,可能由预设层触发

    “Where”应该接近域逻辑


    结合这一点,例如,可能意味着表示层调用域逻辑提供的验证服务。

    您通常需要在几个层执行验证:

    • 客户端层,以确保用户体验尽可能好。例如,避免输入10个字段,然后由于输入无效而不得不重新开始
    • 在服务层,由于您不能100%确定客户机已经处理了请求(可能是因为有人直接向服务层发送了消息)
    • 在服务层,因为有些东西无法在客户端上检查
    好消息是,某些技术允许您一次性指定验证规则,它们将为客户端和服务器生成验证代码。请参阅 这有助于上面的前两种情况。

    +1,也有助于(或者特别是)做出“非此即彼”或“非此即彼”的决定。