Отображать лучшие сообщения об ошибках для пользователя - PullRequest
0 голосов
/ 17 февраля 2020

     private boolean relatedCommand(String input) {
            // make sure the split afterwards has at least size one
            if (input.matches(" .*")) {
                return false;
            }
            final String command = input.split(" ".toString())[0];
            return COMMAND_PACKAGE
                    .keySet()
                    .stream()
                    .map(Pattern::toString)
                    .anyMatch(patternText -> patternText.startsWith(command + " "));
      }


    public Command getCommand(final String input) throws InvalidInputException {
            if (relatedCommand(input)) {
                Terminal.printError("test");
                throw new InvalidInputException("invalid arguments");
            } else {
                throw new InvalidInputException("unknown command");
            }
            ...
     }

У меня проблемы с предоставлением пользователю более конкретного c сообщения об ошибке. Например, у меня есть команды add track <argument1> и add switch <argument1>. Если пользователь просто набирает «добавить», он не должен получить сообщение об ошибке «неверные аргументы». Вместо этого должна быть «недопустимая команда: либо используйте add track, либо добавьте switch). Так как relatedCommand () является логическим значением. Как мне эффективно реализовать это?

1 Ответ

1 голос
/ 17 февраля 2020

Как вы упомянули, в настоящее время метод возвращает boolean, что является результатом двух состояний. В то же время вы ищете результат с тремя состояниями:

  1. команда известна
  2. команда неизвестна
  3. существует несколько команд, известных для префикса.

Для вопроса, касающегося способа возврата правильного результата, одним из вариантов будет возвращение набора возможных команд, которые могут представлять требуемые три состояния:

  1. коллекция состоит из одного элемента
  2. коллекция пуста
  3. коллекция состоит из нескольких элементов.

Изменения в исходном коде могут быть как это:

private Collection<String> relatedCommand(String input) {
        // make sure the split afterwards has at least size one
        if (input.matches(" .*")) {
            return Collections.emptyList();
        }
        final String command = input.split(" ".toString())[0];
        return COMMAND_PACKAGE
                .keySet()
                .stream()
                .map(Pattern::toString)
                .filter(patternText -> patternText.startsWith(comman))
                .collect(Collectors.toList());
  }


public Command getCommand(final String input) throws InvalidInputException {
        Collection<String> commands = relatedCommand(input)
        if (commands.size() == 1) {
            Terminal.printError("test");
            throw new InvalidInputException("invalid arguments");
        } else if (commands.isEmpty()) {
            throw new InvalidInputException("unknown command");
        } else {
            ...
        }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...