Пожалуйста, оцените мой подход к импорту данных с проверкой, которая предоставляет статус клиента - PullRequest
1 голос
/ 26 ноября 2010

Я работаю с подходом импорта CSV, которому я хочу научить других людей, с которыми я работаю, в следующих областях:

  1. Проверка каждой записи перед попыткой обработки (например,сохраняются).
  2. Сбой при любой записи мешает обработке.
  3. Предоставление статуса во время проверки и обработки.

Я хочу подумать над тем, будут ли следующие классы и пример использования достаточно ясными, чтобы соответствовать описанному намерению.

Существует три класса.

Импортер : управляет общим алгоритмом, отслеживает ошибки проверки, предоставляет алгоритм для преобразования каждой строки 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();

Некоторые конкретные вопросы, но, пожалуйста, не стесняйтесь критиковать иначе:

  1. Имеет смыслиспользовать два отдельных класса (на практике, вероятно, внутренний) для проверки и обработки?Или, возможно, переместить все в один класс Importer?
  2. getErrors() в Validator вместо этого, потому что именно здесь возникают ошибки?
  3. currentRow() в Importer вместо Validator и Processor, потому что это действительнотекущая строка общего импорта?

1 Ответ

2 голосов
/ 26 ноября 2010

С точки зрения ОО, я считаю правильным разделять занятия. Я не думаю, что даже необходимо сделать Validator внутренним классом. Подумайте об этом с этой точки зрения. Если вы реализуете это в общем (возможно, так, что однажды вы сможете передать грамматику или какую-то спецификацию, которая говорит Validator, как проверить), вы можете использовать ее для проверки нескольких типов CSV файлов. В этом случае вы не хотите, чтобы он содержался во внешнем классе Importer. В противном случае вам придется каждый раз писать комбинацию Importer / Validator.

Importer - импортер, Validator - валидатор.

Я бы определенно переместил метод getErrors() в Validator. В противном случае это похоже на то, как кто-то другой берет кредит на проделанную вами работу Поскольку Validator выполняет проверку, позвольте ему рассказать миру об ошибках, которые он обнаружил. Не отдавайте славу Importer, он еще ничего не сделал.

Ваш третий пункт не имеет смысла. И Validator, и Importer имеют метод currentRow(). Это кажется правильным. Они функционально разные, и оба должны следить за прогрессом. Одно из изменений, которое вы можете сделать, - это дать Validator метод getTotalNumRows(). Таким образом, после проверки файла Importer может спросить Validator, сколько строк он прочитал во время проверки. Это позволит Importer лучше отображать прогресс, т.е. в процентах, а не только показывая, на какой строке это.

Кроме этого, я думаю, что ваш дизайн хорош.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...