Я работаю с подходом импорта 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.Таким образом, взаимодействие с клиентом происходит (psuedocode - предположим, что выходные данные немедленно сбрасываются в буфер):
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();
Некоторые конкретные вопросы, но, пожалуйста, не стесняйтесь критиковать иначе:
- Имеет смыслиспользовать два отдельных класса (на практике, вероятно, внутренний) для проверки и обработки?Или, возможно, переместить все в один класс Importer?
getErrors()
в Validator вместо этого, потому что именно здесь возникают ошибки? currentRow()
в Importer вместо Validator и Processor, потому что это действительнотекущая строка общего импорта?