Исключения и поток управления - PullRequest
0 голосов
/ 30 апреля 2020

Мне любопытно, является ли это использование блоков try / catch плохой практикой (поток управления). Здесь я проверяю, имеют ли входные данные из массива имен пользователей какие-либо не алфавитные символы c. Я моделирую группу людей, которые отправляют (имя пользователя, имя и возраст), и поэтому результаты могут быть «непредсказуемыми».

Будет ли это рассматриваться с использованием исключений для потока управления? Должен ли я полностью избавиться от них?

function checkDuplicate(name, array){
    for (let user of array){
        if (name == user.username)
            return true;
    } 
}

function checkFormat(testExp,phrase){
    if (testExp.test(phrase) == true)
        return false;
    return true
}

function errorCheck (newUsers){
    let accepted = [];
    let rejected = [];

    for (let user of newUsers){
        let status = true;

        try{ //check existing username
            if (checkDuplicate(user.username,accepted) == true){
                status = false;
                throw new Error (`ERROR: Username (${user.username}) already exists`)
            }
            }catch(error){
                console.log(error.message);
            }

        let regexp = new RegExp("\\W+");

        //checkusername format
        try{
            if (!checkFormat(regexp, user.username))
                throw new Error (`ERROR: Username (${user.username}) the username cannot contain spaces or special characters`)
        }catch(error){ 
            console.log(error.message);
        }
        //check first/last name
        try{

            if (!checkFormat(regexp,user.first) || !checkFormat(regexp,user.last))
                throw new Error (`ERROR: Username (${user.username}) first/last name cannot contain spaces or special characters`)
        }catch(error){
            console.log(error.message);
        }
        //check age > 21
        try{
        if (user.age < 21){
            status = false;
            throw new Error (`ERROR: Username (${user.username}) must be 21 years old`);
        }
    }catch(error){
            console.log(error.message);
    }

        if (status == true) accepted.push(user);
        else rejected.push(user);

    }

    return [accepted, rejected];

1 Ответ

0 голосов
/ 30 апреля 2020

Это много синтаксического шума, который не выполняет sh ничего, чего не могут сделать простые if / else операторы. Излишне подробный код приводит к увеличению площади поверхности для ошибок, которых следует по возможности избегать. Как правило, исключения должны быть исключительные для случаев, когда обычных проверок в текущей функции будет недостаточно.

Вы уже используете if / else - вместо броска, а затем перехватывая в дополнение , просто поместите нужный логик c в if / else.

Вы также можете использовать .some, чтобы проверить, если пользователь с такое же имя пользователя уже существует в массиве.

function errorCheck(newUsers) {
  const accepted = [];
  const rejected = [];
  for (const user of newUsers) {
    let status = true;
    if (accepted.some(({ username }) => user.username === username)) {
      status = false;
      console.log(`ERROR: Username (${user.username}) already exists`)
    }
    if (/\W/.test(user.username)) {
      status = false;
      console.log(`ERROR: Username (${user.username}) the username cannot contain spaces or special characters`)
    }
    if (/\W/.test(user.first) || /\W/.test(user.last)) {
      status = false;
      console.log(`ERROR: Username (${user.username}) first/last name cannot contain spaces or special characters`)
    }
    if (user.age < 21) {
      status = false;
      console.log(`ERROR: Username (${user.username}) must be 21 years old`);
    }
    (status ? accepted : rejected).push(user);
  }
  return [accepted, rejected];
}

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

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