4

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

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

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

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

如果不正常,那我该怎么办?我是否应该将这些条件记录为合同的一部分并提及如果违反此合同,API 将产生荒谬的结果?

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

4

4 回答 4

3

就像大家说的,这取决于你。没有这样的固定/标准指南。但是为了简单起见,您必须将所有验证逻辑放在一个地方,以便它保持可读性和易于更改。

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

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}
    }

}

这会给你两个好处,

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

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

于 2012-08-06T04:49:53.780 回答
2

这是一个复杂的问题,所以解决方案应该尽可能简单,不要让它变得更加复杂和难以理解。

我的方法是:

一些包装私有方法的公共方法命名为类似的东西doAllNeededListsValidationInFixedOrder(),我将在其中创建另一个私有方法-每个方法都用于每个需要的验证。

并且像ofc这样的编写方法doAllNeededListsValidationInFixedOrder应该遵循一些可靠的javadoc,即使它不是公开的。

如果你想寻找模式 - 解决方案不会那么简单。要求按给定顺序进行检查的基本方法是创建批次或类 - 每个状态都告诉该对象在一次检查之后,在另一次检查之前。

因此,您可以通过模式来实现这一点State- 将每个检查视为对象的新状态。

或者

您可以使用诸如Builder模式之类的方法来强制调用方法来创建对象。它基本上是使用许多接口来让每个(构建)方法(这里是验证)从不同的接口触发,以控制它们的顺序。

回到开始 -使用简单、文档齐全且命名正确的方法,隐藏验证方法集,对我来说似乎更好。

于 2012-08-05T21:23:35.397 回答
2

我取决于你。许多检查没有真正的论据。如果您正在开发 API,这对其他程序员可能非常有用。它将使您自己的程序更加可靠。

我认为重要的一点是,你在一个点上进行检查。您的 API 必须有一个干净简单的接口。在这个界面,可以进行检查。在这些检查之后,您可以确定一切正常。

如果你把支票扔掉会发生什么?会在某处抛出异常还是程序会做某事?如果程序能正常工作并且做一些不可预测的事情,你应该提供检查,否则事情会开始变得奇怪。但是,如果无论如何都会抛出异常,(我认为)你可以放弃检查。我的意思是,无论如何,该程序都会出现异常。

于 2012-08-05T21:24:24.763 回答
0

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

如果从数据转换的角度处理这些检查将变得微不足道。

  1. List from a client实际上是任何可能元素的任何列表

  2. List from a client将被转换为定义明确的list of not duplicating not null elements

  3. 这种转换可以分解为几个简单的转换ToNonNull,,ToNonNullListToNonDuplicatingList

  4. 最后一个要求本质上是从两个列表转换为一个对列表ToPairs(ListA, ListB)

放在一起就变成了:

ParentTableColumns = List1FromClient.
    ToNonNull.
    ToNonNullList.
    ToNonDuplicatingList

ChildTableColumns = List2FromClient.
    ToNonNull. 
    ToNonNullList.
    ToNonDuplicatingList

ParentChildColumnPairs = List.
    ToPairs(ParentTableColumns, ChildTableColumns)

如果来自客户端的数据有效,则所有转换都成功并获得有效结果。

如果来自客户端的数据无效,则其中一个转换失败并产生错误消息。

于 2016-01-02T15:11:27.867 回答