请使用提供客户端状态的验证批判我的数据导入方法

时间:2010-11-26 02:29:54

标签: java coldfusion

我正在使用CSV导入方法,我想教给我工作的其他人,我关心以下内容:

  1. 在尝试处理之前验证每个记录(例如,持久化)。
  2. 任何记录失败都会阻止处理。
  3. 在验证和处理过程中提供状态。
  4. 我正在寻找的是关于以下类和用法示例是否足够清晰以满足所描述的意图的想法。

    有三个班级。

    导入程序:管理整体算法,跟踪验证错误,提供算法将每个CSV行转换为可以验证或处理的数据结构。

    Importer(CSVFile)
    getProcessor(): Processor
    getValidator(): Validator
    getErrors(): array
    isOKToProcess(): boolean
    lineToData(String data): Object
    

    验证程序:验证整个文件和每一行以确保可以处理

    close(): void
    currentRow(): int
    hasNext(): boolean
    doNext(): void
    

    处理器:保留每一行

    close(): void
    currentRow(): int
    hasNext(): boolean
    doNext(): void
    

    正如您所看到的,最后两个大致坚持Java样式迭代器。因此,客户端交互(伪代码 - 假设输出立即刷新到缓冲区):

    importer = new Importer("/path/to/file.csv");
    validator = importer.getValidator();
    writeOutput("validating<br/>");
    while (validator.hasNext()) {
      validator.doNext();  
      writeOutput(validator.currentRow() & "<br/>");
    }
    validator.close();
    if (!importer.isOKToProcess()) {
      writeOutput("errors<br/>");
      writeOutput(importer.getErrors());
      return; // short circuit
    }
    processor = importer.getProcessor();
    writeOutput("processing<br/>");
    while(processor.hasNext()) {
      processor.doNext();
      writeOutput(processor.currentRow()  & "<br/>");
    }
    processor.close();
    

    一些具体问题,但请随意批评:

    1. 有意义使用两个单独的类(在实践中可能是内部)进行验证和处理?或者将所有内容都移到一个Importer类中?
    2. 相反,在
    3. getErrors()中,因为那是引发错误的地方?
    4. 导入器上的
    5. currentRow()而不是验证器和处理器,因为它实际上是整个导入的当前行?

1 个答案:

答案 0 :(得分:2)

从OO的角度来看,我认为将这些课程分开是正确的。我认为甚至不必将Validator作为内部阶级。从这个角度考虑它。如果你通常实现这个(也许有一天你可以传入一个语法或某种规范来告诉Validator如何验证),你可以使用它来验证多种类型的CSV文件。在这种情况下,您不希望它包含在外部Importer类中。否则,您每次都必须编写Importer / Validator组合。

Importer是导入者,Validator是验证者。

我肯定会将getErrors()方法移到Validator。否则,就像其他人因为你所做的工作而受到赞誉。由于Validator正在进行验证,因此让它告诉全世界它发现的错误。不要把荣耀归给Importer,它还没有做任何事情。

你的第三点并没有多大意义。 ValidatorImporter都有currentRow()方法。这似乎是正确的。它们在功能上是不同的,都需要跟踪进度。您可以做出的一项更改是让Validator拥有getTotalNumRows()方法。这样,一旦验证了文件,Importer就可以询问Validator在验证期间读取了多少行。这将使Importer更好地显示进度,即。作为百分比,而不是只显示它是哪一行。

除此之外,我认为你的设计很好。