我正在使用CSV导入方法,我想教给我工作的其他人,我关心以下内容:
我正在寻找的是关于以下类和用法示例是否足够清晰以满足所描述的意图的想法。
有三个班级。
导入程序:管理整体算法,跟踪验证错误,提供算法将每个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();
一些具体问题,但请随意批评:
getErrors()
中,因为那是引发错误的地方?currentRow()
而不是验证器和处理器,因为它实际上是整个导入的当前行? 答案 0 :(得分:2)
从OO的角度来看,我认为将这些课程分开是正确的。我认为甚至不必将Validator
作为内部阶级。从这个角度考虑它。如果你通常实现这个(也许有一天你可以传入一个语法或某种规范来告诉Validator
如何验证),你可以使用它来验证多种类型的CSV
文件。在这种情况下,您不希望它包含在外部Importer
类中。否则,您每次都必须编写Importer
/ Validator
组合。
Importer
是导入者,Validator
是验证者。
我肯定会将getErrors()
方法移到Validator
。否则,就像其他人因为你所做的工作而受到赞誉。由于Validator
正在进行验证,因此让它告诉全世界它发现的错误。不要把荣耀归给Importer
,它还没有做任何事情。
你的第三点并没有多大意义。 Validator
和Importer
都有currentRow()
方法。这似乎是正确的。它们在功能上是不同的,都需要跟踪进度。您可以做出的一项更改是让Validator
拥有getTotalNumRows()
方法。这样,一旦验证了文件,Importer
就可以询问Validator
在验证期间读取了多少行。这将使Importer
更好地显示进度,即。作为百分比,而不是只显示它是哪一行。
除此之外,我认为你的设计很好。