Это хороший случай для шаблона стратегии

У меня есть следующие входы:

  1. Файл CSV
  2. Массив грамматических правил. Правила грамматики
    в основном метаданные, которые говорят мне, что каждый тип данных столбца
    должно быть.

Вывод вернет мне список записей, в которых были ошибки. Так что, если столбец должен быть датой, но у меня неправильный формат. Я бы вернул эти строки.

Файл 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;
    }
}
Другие вопросы по тегам