2012-08-05 24 views
4

我有一个模型FK关系的类。它有2个列表。这些列表分别包含父表&子表的列名。这些清单是客户传给我的。在创建我的FK对象之前,我认为有必要进行以下检查(按顺序):如何在创建对象之前处理大量的验证检查?

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

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

如果可以进行这些检查,是否有任何模式来处理这种情况(具有很高的验证检查数量)?

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

编辑:基本上,我试图把这两个列表&产生一个数据库特定的查询。所以,正确构建这个对象是非常重要的。

+0

是否可以在数据库中进行检查?例如。通过约束或触发器? – 2012-08-05 21:33:02

+0

没有。我只会将查询写入文件,客户端将对数据库运行此文件。 – user1522820 2012-08-05 21:35:09

+0

请参阅我的编辑 – dantuch 2012-08-05 21:38:32

回答

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集合的情况,但不适用于单个实体......它是业务逻辑,而不是验证逻辑

+0

谢谢你。真的很好的解释。这种方法唯一的目的是在消化时间后面创建和验证对象。就我而言,我想快速失败。但是这种方法非常好。在其他情况下,我可能会发现它有帮助。同时,我决定将所有的验证检查都保存在每个人都建议的1个地方。 – user1522820 2012-08-06 05:07:08

2

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

我的做法是:命名的东西

一些公共方法包装私有方法类似doAllNeededListsValidationInFixedOrder()中,我想创建另一个私有方法 - 为每一个需要每个验证。

像​​这样的写作方法应该跟随一些扎实的javadoc,即使它不公开。

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

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

OR

您可以使用类似Builder图案的调用来创建对象的方法强迫命令。它基本上使用大量的接口来从不同的接口触发每一个(构建)方法(这里验证),以控制它们的顺序。

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

+0

感谢您的回答。我决定用一种单独的方法在一个地方进行检查。 – user1522820 2012-08-06 04:48:29

2

我靠你。对许多检查没有真正的争论。如果你正在开发一个API,这对其他程序员可能非常有用。它会让你自己的程序更加可靠。

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

如果您将支票离开,会发生什么情况?某个地方会抛出一个异常,或者程序会做些什么?如果该程序将只是工作,并做一些不可预知的,你应该提供支票或事情会开始变得奇怪。但是,如果一个异常会被抛出无论如何,(我认为),你可以叶检查了。我的意思是,该程序无论如何都会得到一个例外。

+0

感谢您的回答。我决定在一个地方做检查。 – user1522820 2012-08-06 04:46:20

0

如果它是确定有这么多检查,没有任何模式来处理这样的情况下(高无。验证检查)?

从数据转换的角度来看,这些检查变得微不足道。

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

  2. List from a client是要转换为明确限定list of not duplicating not null elements

  3. 这种转换可以被分解成几个简单的转换ToNonNullToNonNullListToNonDuplicatingList

  4. 最后的要求基本上是conv从版为两个列表:对一个列表ToPairs(ListA, ListB)

放在一起就变成:

ParentTableColumns = List1FromClient. 
    ToNonNull. 
    ToNonNullList. 
    ToNonDuplicatingList 

ChildTableColumns = List2FromClient. 
    ToNonNull. 
    ToNonNullList. 
    ToNonDuplicatingList 

ParentChildColumnPairs = List. 
    ToPairs(ParentTableColumns, ChildTableColumns) 

如果从客户端的数据是有效的,那么所有的转换成功,并得到有效的结果。

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

相关问题