Это хороший случай для шаблона стратегии
У меня есть следующие входы:
- Файл CSV
- Массив грамматических правил. Правила грамматики
в основном метаданные, которые говорят мне, что каждый тип данных столбца
должно быть.
Вывод вернет мне список записей, в которых были ошибки. Так что, если столбец должен быть датой, но у меня неправильный формат. Я бы вернул эти строки.
Файл CSV будет выглядеть примерно так:
first_name,last_name,dob,age,
john,doe,2001/05/02
mary,jane,1968/04/01
Метаданные:
column:first_name
type:string
column:dob
type:date
Мне было интересно, если модель стратегии будет правильным выбором. Я думал инъекционное правильную грамматику (метаданные), в зависимости от файла. У меня есть несколько файлов, которые я хочу проверить.
1 ответ
Эта проблема нуждается в обработчиках проверки (для вашего правила грамматики). Глядя на более низкий уровень сложности и ожидаемые расширения, я не чувствую необходимости какого-либо конкретного шаблона проектирования. Я бы предложил следующий простой ОО подход. В качестве альтернативы, в зависимости от ожидаемого динамического поведения, можно включить COR, поместив каждый конкретный обработчик в цепочку (COR). Передайте каждый токен в цепочке, чтобы дать возможность обработчикам в цепочке, пока он не будет обработан.
public class Extractor {
public static void main(String[] args) {
// PREPARE TEMP_MAP_HANDLERS<Type,Handler>
Map<String, Handler> handlers = new HashMap<>();
handlers.put("FIRST_NAME",new NAMEHandler());
handlers.put("LAST_NAME",new NAMEHandler());
handlers.put("DOB",new DOBHandler());
handlers.put("AGE",new AGEHandler());
// READ THE HEADER
String header = "first_name,last_name,dob,age";// SAMPLE READ HEADER
// PREPARE LOOKUP<COL_INDEX, TYPE_HANDLER>
Map<Integer, Handler> metaHandlers = new HashMap<>();
String[] headerTokens = header.split(",");
for (int i = 0; i < headerTokens.length; i++) {
metaHandlers.put(i, handlers.get(headerTokens[i].toUpperCase()));
}
// DONE WITH TEMP HANDLER LOOKUP
// READ ACTUAL ROWS
// FOR EACH ROW IN FILE
String row = "joh*n,doe,2001/05/02";
String[] rowTokens = row.split(",");
for (int i = 0; i < rowTokens.length;i++) {
System.out.println(rowTokens[i]);
Handler handler = metaHandlers.get(i);
if (!handler.validate(rowTokens[i])){
// REPORT WRONG DATA
System.out.println("Wrong Token" + rowTokens[i]);
}
}
}
}
abstract class Handler {
abstract boolean validate (String field);
}
class NAMEHandler extends Handler{
@Override
boolean validate(String field) {
// Arbitrary rule - name should not contain *
return !field.contains("*");
}
}
class DOBHandler extends Handler{
@Override
boolean validate(String field) {
// Arbitrary rule - contains /
return field.contains("/");
}
}
class AGEHandler extends Handler{
@Override
boolean validate(String field) {
// TODO validate AGE
return true;
}
}