Улучшение конструкции if-else при валидации значений

243
04 апреля 2017, 10:05

Думаю, конструкцию if-else можно улучшить, но не могу придумать как. Что можно сделать?

if ((limit != null && !limit.matches("^-?\\d+$") && !limit.equals("")) 
        || (length != null && !length.matches("^-?\\d+$") && !length.equals(""))
        || (limit != null && limit.matches("^-?\\d+$") && Integer.parseInt(limit) < 0)
        || (length != null && length.matches("^-?\\d+$") && Integer.parseInt(length) < 0))
{
    resp.sendError(HttpServletResponse.SC_BAD_REQUEST);
}
else
{
    resp.setContentType("application/json;charset=utf-8");
    resp.getWriter().write(TextFileAPI.TextFileQuery(q, limit, length, appPath));
}
Answer 1

Код проверки валидности для limit и length одинаков, так что можно его вынести в отдельный метод и вызывать для каждого значения.

Допустимыми значениями, судя по коду, являются null, пустая строка, а также неотрицательные Integer.

В итоге получается так. Метод проверки:

private static boolean isCorrect(String value)
{
    return (value == null || value.equals("") ||
            (value.matches("^\\d+$") && Integer.parseInt(value) >= 0));
}

Его использование:

if (isCorrect(limit) && isCorrect(length))
{
    //correct data handling
}
else
{
    //incorrect data handling
}

Дабы при обработке больших чисел, не входящих в Integer (например, 3 миллиарда), метод isCorrect не "падал" с NumberFormatException, стоит несколько усложнить код:

private static boolean isCorrect(String value)
{
    if (value == null || value.equals(""))
    {
        return true;
    }
    boolean isCorrect = false;
    try
    {
        isCorrect = Integer.parseInt(value) >= 0;
    }
    catch (NumberFormatException ignored) { }
    return isCorrect;
}
Answer 2

простой пример и я думаю вы поймете как применить к вашему коду:

    var t_event={};
     t_event[0]=function(){return;};
     t_event[1]=function(a,b){ return console.log(a*b);},
     test;
     function test(_t,_event,_a,_b){
         return _event[(!(_t === 1))+0](_a,_b);
     };
     test(0,t_event,3,5);

можно делать переход по "индексу" [0/1] в разных вариантах, это и будет отработка условия, просто проверки как таковой нет, по результату предыдущего действия (false/true) вы сразу "проваливаетесь" через индекс в нужную функцию или событие...

READ ALSO
Как дать доступ к сайту на java Servlet API с домашнего компьютера?

Как дать доступ к сайту на java Servlet API с домашнего компьютера?

Задача следующая: дать доступ к учебным "pet" проектам с внешней машины наименее трудозатратным способом

219
Прокручивающийся position: sticky?

Прокручивающийся position: sticky?

Есть сайдбар, высота которого превышает высоту экранаКак известно, position: sticky при прокрутке просто закрепляет верх блока вверху страницы...

214
Изменить src у iframe javascript&#39;ом

Изменить src у iframe javascript'ом

Здравствуйте! Подскажите, пожалуйста, правильно ли я решаю вопрос:

356
Смена селектора на разных блоках js

Смена селектора на разных блоках js

Всем приветКак по нажатию кнопки "Выбрать" на одном блоке, data-background-color стали smoke на двух других? Код сдесь: https://codepen

185