我有一个模拟FK关系的课程。它有2个列表。这些列表包含父表和列表的列名。儿童表分别。这些列表是客户端传递给我的。现在在创建我的FK对象之前,我认为有必要进行以下检查(按顺序):
所以你可以看到总共有7张支票。有这么多支票可以吗?
如果可以进行这么多检查,是否有任何模式可以处理这种情况(有大量的验证检查)?
如果不行,那我该怎么办?我是否应该将这些条件记录为合同的一部分&如果违反合同,那么API会产生无意义的结果吗?
编辑:基本上,我正在尝试使用这两个列表&生成特定于数据库的查询。因此,正确构建此对象非常重要。
答案 0 :(得分: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}
}
}
这将为您带来两个好处,
您的实体特定验证逻辑保存在一个位置(尝试将大多数逻辑视为特定于实体的逻辑)
您的集体逻辑与实体逻辑是分开的,因为您不能将这些逻辑放在您的实体中,因为这些逻辑仅适用于存在FKEntity集合的情况,但不适用于单个实体...它是业务逻辑,而不是验证逻辑
答案 1 :(得分:2)
这是一个复杂的问题,所以解决方案应该是最简单的,不要让它变得更复杂,也不易理解。
我的方法是:
一些公共方法包装名为doAllNeededListsValidationInFixedOrder()
的私有方法,其中我创建了另一个私有方法 - 每个方法用于每个需要的验证。
像doAllNeededListsValidationInFixedOrder
之类的ofc编写方法应该遵循一些可靠的javadoc,即使它不是公开的。
如果你想采用模式 - 解决方案不会那么简单。要求按给定顺序进行检查的基本要点是创建批次或类 - 每个用于表示对象在一次检查之后,在另一次检查之前的状态。
因此,您可以使用State
模式实现此目的 - 将每个检查视为新的对象状态。
OR
您可以使用Builder
模式之类的东西,并强制调用方法来创建对象。它基本上使用了很多接口来从不同的接口触发每个(构建)方法(这里验证),以控制它们的顺序。
回到开始 - 使用简单,文档齐全且命名正确的方法,隐藏验证方法集,对我来说似乎更好。
答案 2 :(得分:2)
我取决于你。对许多检查没有真正的论据。如果您正在开发API,这对其他程序员非常有用。它将使您自己的程序更可靠。
我认为重要的是,您在一个点上进行检查。您必须拥有一个简洁的API界面。在这个界面中,可以进行检查。经过这些检查后,您可以确定一切正常。
如果你把支票丢掉会怎么样?会在某处抛出异常还是程序只会做某事?如果程序只是工作并做一些不可预测的事情,你应该提供支票或事情会变得奇怪。但是,无论如何都会抛出异常,(我想)你可以把支票丢掉。我的意思是,该程序无论如何都会有例外。
答案 3 :(得分:0)
如果可以进行这么多检查,是否有任何模式可以处理这种情况(有大量的验证检查)?
如果从数据转换的角度来看,这些检查变得微不足道。
List from a client
实际上是任何可能元素的列表
List from a client
将转换为明确定义的list of not duplicating not null elements
此转化可以分解为几个简单的转化ToNonNull
,ToNonNullList
,ToNonDuplicatingList
最后一项要求实质上是从两个列表转换为一对对象列表ToPairs(ListA, ListB)
把它组合成:
ParentTableColumns = List1FromClient.
ToNonNull.
ToNonNullList.
ToNonDuplicatingList
ChildTableColumns = List2FromClient.
ToNonNull.
ToNonNullList.
ToNonDuplicatingList
ParentChildColumnPairs = List.
ToPairs(ParentTableColumns, ChildTableColumns)
如果客户端的数据有效,则所有转换都会成功,并获得有效结果。
如果来自客户端的数据无效,则其中一个转换将失败并生成错误消息。