Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在创建对象之前处理大量必要的验证检查?_Java_Design Patterns - Fatal编程技术网

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

Java 如何在创建对象之前处理大量必要的验证检查?,java,design-patterns,Java,Design Patterns,我有一个模拟FK关系的类。它有两个列表。这些列表分别包含父表和子表的列名。客户将这些列表传递给我。现在,在创建FK对象之前,我认为有必要进行以下检查(按顺序): 检查列表是否不为空 检查列表是否包含空值 如果列表包含重复的列 两个列表的大小相同 所以你可以看到总共有7张支票。有这么多支票可以吗 如果可以进行这么多检查,是否有任何模式来处理此类情况(验证检查次数较多) 如果不行,我该怎么办?我是否应该将这些条件记录为合同的一部分,并提及如果违反合同,API将产生无意义的结果 编辑:基本上,我正在尝

我有一个模拟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)
    
    若来自客户端的数据有效,则所有转换都会成功并获得有效结果


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

    是否可以在数据库中进行检查?例如,通过约束或触发器?不。我将把查询写入文件&客户端将针对数据库运行此文件。谢谢您的回答。我决定在一个地方检查。谢谢你的帮助