OOP设计 - 验证时验证意味着命中数据库进行检查

时间:2011-02-18 05:56:04

标签: oop

让我们假装我们正在讨论HTML投诉表单,其中一个字段是公司目录中的产品列表。

我认为通常(总是?)验证会进入自己的类。

我还认为最好有网关类可以在内部处理所有数据库查询,因此当我从投诉表单中保存投诉时,我不必担心数据库细节。

但是需要访问数据库的验证呢 - 例如检查产品实际上是我们拥有的产品(而不是有人篡改表单)。这只能通过在数据库中找到匹配来完成......但我的数据库是在我的网关后面抽象的。

我是否在网关中添加验证逻辑?我是否创建验证器网关类?我是否使用数据库逻辑授权我的验证器?

编辑 - 尝试澄清......

  1. 客户点击指向投诉表单的链接
  2. HTML投诉表单使用我们虚构的公司目录中的X产品<select><item></item></select>下拉列表构建
  3. 客户填写表单并提交 // Wiseguy改变HTML,因此产品为“Schweddy Balls”并提交
  4. 表单类验证简单的事情,如日期,所有必填字段都有数据,电子邮件地址等。
  5. 在步骤4,为了验证被投诉的产品是否合法,您必须点击数据库的产品表以查看它是否仍然是有效的数据点。该逻辑应该在表单类,网关类还是其他地方?将它放在表单类中会产生依赖关系,不是吗?

2 个答案:

答案 0 :(得分:0)

通常,只存储有效数据是一种好习惯。因此,必须在服务器端编写验证器以确保请求有效且仅将有效数据放入数据库中,并且作为优化通常在客户端验证(例如在JavaScript中)以便通知用户输入无效而无需提交表格而无需进行往返。作为数据库写入的一部分进行验证,允许在没有检查的情况下完成后续读取。

我不知道对你来说什么算是“有效”的细节,但你可以用缓存来节省大量的数据库查找。也许您可以提供一些有关您的要求的更多信息?

答案 1 :(得分:0)

奇怪的是,验证应该不是通过Validation类直接完成的。模型对象的类(在本例中可能是Complaint)应该包含Validation类,并且应该在那里进行验证。由于投诉可以访问所有投诉,验证方法可以使用Complaint类的方法,或者在需要时调用另一个模型类。

当您对数据库说“网关”时,我相信您正在谈论Object Relational Mapping(ORM),它允许模型对象(如投诉)抽象地与数据库通信。 ORM应该不了解应用程序的结构或细节,它应该只是对象的抽象API,以便与数据库或其他后端进行通信。

当然,我的回答并不涵盖所有内容,因此欢迎进一步的问题/澄清。