Более чистый способ борьбы с этими пунктами if? - PullRequest
0 голосов
/ 06 февраля 2019

Мне интересно, что было бы более чистым способом справиться с этой связкой if предложений.В качестве дополнительной информации это обработчик исключений, который будет использоваться в учебном проекте Spark Framework.

Этот фрагмент кода выполняет свою работу и доступен для чтения, но возможное дальнейшее расширение превратит его в монстра.Есть ли у вас какие-либо предложения по его рефакторингу?

    public ExceptionHandler<? super java.lang.Exception> handler() {
        return (e, request, response) -> {
            ErrorMessage error;

            if (e instanceof SomeException1) {
                response.status(422);
                error = new ErrorMessage("message1", e.getMessage());
            } else if (e instanceof SomeException2) {
                response.status(404);
                error = new ErrorMessage("message2", e.getMessage());
            } else if (e instanceof SomeException3) {
                response.status(500);
                error = new ErrorMessage("message3", e.getMessage());
            } else {
                response.status(500);
                error = new ErrorMessage("message4", e.getMessage());
            }

            [...]
        };
    }

Редактировать для уточнения:

Этот фрагмент кода является частью метода обработчика исключений, который зарегистрирован в основном классе приложения с помощью Spark's exception() метод.Примерно так:

public class MainClass {

    public static void main(String[] args) {
      //register the exception handler
      exception(Exception.class, errorsHandler.handler()); //handler() is the method showed above.
    }    
}

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Моя версия будет выглядеть примерно так:

class ExceptionInfo {
   Class<? extends Exception> cls;
   int errCode;
   String message;

   public ExceptionInfo(Class<? extends Exception> cls, int errCode, String message) {
       this.cls = cls;
       this.errCode = errCode;
       this.message = message;
   }
}

// Note that the last item is Exception.class, to serve as a default.

final static List<ExceptionInfo> EXCEPTION_LIST = Arrays.asList(
    new ExceptionInfo( SomeException1.class, 422, "message1"),
    new ExceptionInfo( SomeException2.class, 404, "message2"),
    new ExceptionInfo( SomeException3.class, 500, "message3"),
    new ExceptionInfo( Exception.class, 500, "message4" )
);

ExceptionInfo searchException( Exception e ) {
    return EXCEPTION_LIST.stream()
        .filter( info -> info.cls.isInstance(e) )
        .findFirst()
        .orElseThrow( IllegalStateException::new );
}

С этим вы можете получить ExceptionInfo, совместимый с данным e, а затем использовать его errCode и message.Это полностью совместимо с instanceOf.Конечно, вы можете использовать геттеры вместо прямого доступа к полям этого мини-класса.

0 голосов
/ 06 февраля 2019

Хороший способ избежать длинных цепочек if- / else - использовать таблицу сопоставления.Вы можете использовать карту, которая отображает класс исключения в код состояния.Например:

private static Map<Class<?>, Integer> errorCodeMapping = new HashMap<>();

{
    errorCodeMapping.put(SomeException.class, 422);
    ...
}

Ваш обработчик исключений затем установит код как

response.status(errorCodeMapping.get((e.getClass()));

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

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