关于软件设计:哪里必须检查参数?

Van*_*nel 5 validation software-design

想象一下,我有一个应用程序向用户请求一个名称,一个类别列表.当用户单击"保存"按钮时,应用程序会将名称和类别保存到数据库中.

我有一个从UI获取名称和类别的图层.此图层检查是否有名称(长度> 0的字符串).如果这是正确的,它会将一个类别的名称传递给另一个图层.注意:category是radiobutton列表,其中始终选择一个项目.

在第二层,应用程序将根据类别选择合适的类来保存名称.

在最后一层,类将该名称保存在数据库中.在这个课上,我将检查姓名是否为空.

我的问题是:检查方法输入参数的正确位置在哪里?在每一层?也许,我将在其他开发中使用这些层.

我的例子是正确的吗?也许,我可以在数据库层上保留验证并向UI层引发异常.

kvi*_*sta 3

一般来说,就验证最终持久化输入的更大问题而言,最好:

  • 收到输入参数后,尽快将其转换为完全封装的业务对象。

  • 尽早验证并快速失败,然后等到到达较低层 - 浪费资源,浪费时间,可能更复杂(更多的事情需要回滚)。

  • 验证一次业务逻辑并将其作为对象实例化过程的一部分。(但请注意,视图逻辑和持久性逻辑的验证可能需要在其他层完成,并且与业务逻辑分开)

  • 使用 ORM(例如 Hibernate)对如何持久化对象进行建模,以便您可以纯粹在内存中的对象级别工作,并将持久性保留为实现细节。将业务逻辑集中在对象层。

就方法验证本身而言,我同意 Oded——在每一层,并且应该在方法输入后立即完成。同样,这是快速失败方法的一部分。但是,正如我上面指出的,这并不意味着您要在每个方法(或每个层)验证业务逻辑。我只是指验证输入的基本实践(通过断言或显式检查和抛出异常)。