Java 如何在创建对象之前处理大量必要的验证检查?
我有一个模拟FK关系的类。它有两个列表。这些列表分别包含父表和子表的列名。客户将这些列表传递给我。现在,在创建FK对象之前,我认为有必要进行以下检查(按顺序):Java 如何在创建对象之前处理大量必要的验证检查?,java,design-patterns,Java,Design Patterns,我有一个模拟FK关系的类。它有两个列表。这些列表分别包含父表和子表的列名。客户将这些列表传递给我。现在,在创建FK对象之前,我认为有必要进行以下检查(按顺序): 检查列表是否不为空 检查列表是否包含空值 如果列表包含重复的列 两个列表的大小相同 所以你可以看到总共有7张支票。有这么多支票可以吗 如果可以进行这么多检查,是否有任何模式来处理此类情况(验证检查次数较多) 如果不行,我该怎么办?我是否应该将这些条件记录为合同的一部分,并提及如果违反合同,API将产生无意义的结果 编辑:基本上,我正在尝
编辑:基本上,我正在尝试获取这两个列表并生成一个特定于数据库的查询。因此,正确构建此对象非常重要。这是一个复杂的问题,因此解决方案应该尽可能简单,不要使其变得更加复杂和不易理解 我的做法是: 一些名为
doAllNeedListValidationFixedOrder()
的公共方法包装私有方法,我将在其中创建另一个私有方法,每个方法用于每个需要的验证
而像doallneedListsValidationFixedOrder
这样的ofc编写方法后面应该有一些可靠的javadoc,即使它不是公共的
如果您想使用模式,那么解决方案就不会这么简单了。按给定顺序进行检查的基本要求是创建批或类,每个批或类都用于状态,告诉对象在一次检查之后,在另一次检查之前
因此,您可以使用状态模式来实现这一点-将每个检查视为对象的新状态
或
您可以使用类似于Builder
pattern的东西,强制调用方法的顺序来创建对象。它基本上是使用许多接口,让每个(构建)方法(这里是验证)从不同的接口触发,以控制它们的顺序
回到起点-使用简单、文档丰富且命名正确的方法,隐藏验证方法集,对我来说似乎更好。我取决于您。对许多支票没有真正的反对理由。如果您正在开发API,这对其他程序员非常有用。它将使您自己的程序更加可靠
我认为重要的一点是,你在一个点上做检查。您的API必须有一个干净、简单的接口。在此界面中,可以进行检查。在这些检查之后,你可以确定一切正常
如果你不收支票怎么办?是否会在某个地方抛出异常,或者程序只是执行某些操作?如果程序只是工作并且做了一些不可预知的事情,你应该提供检查,否则事情就会变得奇怪。但是,如果无论如何都会抛出一个异常,(我认为)您可以离开检查。我的意思是,这个程序无论如何都会有例外。就像大家说的,这取决于你。没有关于这方面的固定/标准指南。但要使其简单,您必须将所有验证逻辑放在一个位置,以便它保持可读性并易于更改
一个建议是,正如您所说,您的所有验证逻辑似乎都非常面向业务。我的意思是,最终用户不应该为您的数据库配置而烦恼。假设您的类名为FKEntity。因此,如果遵循实体概念,则可以将验证逻辑放在FKEntity.validate()(实现可验证的接口)中,该接口将验证特定实体…这适用于以相同方式应用于所有FKEntity类型对象的验证逻辑。如果您需要任何验证逻辑来相互比较/处理不同的实体(例如,如果有一个实体的某个值为“x”,则其他实体的值不能为“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}
}
}
这将给你两个好处
您的特定于实体的验证逻辑保存在一个地方(尝试将大多数逻辑视为特定于实体的逻辑)
您的集合逻辑与实体逻辑是分开的,因为您不能将这些逻辑放在您的实体中,因为这些逻辑仅适用于实体集合,而不适用于单个实体……它是业务逻辑,而不是验证逻辑
如果可以进行这么多检查,是否有任何模式来处理此类情况(验证检查次数较多)
如果从数据转换的角度来处理,这些检查将变得微不足道
客户端的列表实际上是任何可能元素的列表
来自客户端的列表
将转换为定义良好的不重复非空元素列表
此转换可以分解为几个简单的转换ToNonNull
,ToNonNullList
,ToNonDuplicatingList
最后一个要求基本上是从两个列表转换为一个成对列表ToPairs(ListA,ListB)
把它放在一起就成了:
ParentTableColumns = List1FromClient.
ToNonNull.
ToNonNullList.
ToNonDuplicatingList
ChildTableColumns = List2FromClient.
ToNonNull.
ToNonNullList.
ToNonDuplicatingList
ParentChildColumnPairs = List.
ToPairs(ParentTableColumns, ChildTableColumns)
若来自客户端的数据有效,则所有转换都会成功并获得有效结果
如果来自客户端的数据无效,则其中一个转换失败并产生错误消息。是否可以在数据库中进行检查?例如,通过约束或触发器?不。我将把查询写入文件&客户端将针对数据库运行此文件。谢谢您的回答。我决定在一个地方检查。谢谢你的帮助