在创建对象之前如何处理大量必要的验证检查?

use*_*820 5 java design-patterns

我有一个模拟 FK 关系的课程。它有 2 个列表。这些列表分别包含父表和子表的列名称。这些清单是客户传给我的。现在,在创建 FK 对象之前,我认为有必要进行以下检查(按顺序):

  1. 检查列表是否不为空。
  2. 检查列表是否包含 null。
  3. 如果列表包含重复的列?
  4. 两个列表的大小相等。

所以你可以看到总共有 7 个检查。这么多支票可以吗?

如果可以进行这么多检查,是否有任何模式可以处理此类情况(具有大量验证检查)?

如果不行的话我该怎么办?我是否应该将这些条件记录为合同的一部分,并提及如果违反此合同,API 将产生无意义的结果?

编辑:基本上,我试图获取这两个列表并生成特定于数据库的查询。因此,正确构建该对象非常重要。

Abh*_*jee 4

正如大家所说,这取决于你。对此没有这样的固定/标准指南。但为了简单起见,您必须将所有验证逻辑放在一处,以便它保持可读且易于更改。

正如您所说,一个建议可能是您的所有验证逻辑似乎都非常面向业务。我的意思是最终用户不应该担心您的数据库配置。假设您的类名称为 FKEntity。因此,如果您遵循实体概念,那么您可以将验证逻辑放入 FKEntity.validate() (实现 Validatable 接口)中,这将验证特定实体...这适用于适用于所有 FKEntity 类型对象的验证逻辑以同样的方式。如果您需要任何验证逻辑来​​比较/处理相互依赖的不同 FKEntity(例如,如果有一个 FKEntity 具有某个值“x”,那么没有其他实体可以将“x”作为其值,如果有,那么您可以不允许整个实体列表持久化),那么你可以将逻辑放在你的Service层中。

Inteface Validatable { void validate() throws InvalidEntityException; }   

Class FKEntity implements Validatable {
  //..
  public void validate() throws InvalidEntityException {
     //your entity specific logic
  }
}

Class FKDigestService {

    public digestEntities() {

      try {
      for(FKEntity e : entityList)
         e.validate();

      //your collective validation logic goes here
      } catch (EntityValidationException e) {//do whatever you want}
    }

}
Run Code Online (Sandbox Code Playgroud)

这会给你带来两个好处,

  1. 您的实体特定验证逻辑保存在一个位置(尝试将大部分逻辑视为实体特定逻辑)

  2. 您的集体逻辑与实体逻辑分开,因为您不能将这些逻辑放入您的实体中,因为这些逻辑仅适用于存在 FKEntity 集合的情况,而不适用于单个实体......它是业务逻辑,而不是验证逻辑