2013-03-14 2 views
5

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

Псевдо-код что-то вроде:

if (fulfills_condition_1) 
{ 
    if (fulfills_condition_2) 
    { 
     if (fulfills_condition_3) 
     { 
      /*process message*/ 
     } 
     else 
      cout << error_message_3; //where error_message_1 is a string detailing error 
    } 
    else 
     cout << error_message_2; //where error_message_2 is a string detailing error 
} 
else 
    cout << error_message_1; //where error_message_3 is a string detailing error 

Существует вероятность того, что число этих условий может увеличиться, и мне было интересно, если там был аккуратнее способ представления этого с помощью переключателя или что-то вроде что вместо множества каскадных if утверждений.

Я знаю, что есть возможность использования

if (fulfills_condition_1 && fulfills_condition_2 && fulfills_condition_3) 
    /*process message*/ 
else 
    error_message; //"this message is not formatted properly" 

но это менее полезно, чем первый, и не говорит, где проблема.

условия могут быть грубо расположены все большее значение, т.е. проверки condition_1 является более важным, чем проверка condition_3, поэтому if заявления делают работу - но есть лучший способ в целом для этого?

+1

Исключения ..... –

+0

Вы считали, что проверки с отрицательным состоянием связаны с попыткой-catch и классом исключений, который точно отражает условие, которое сработало с проблемой в первую очередь? – WhozCraig

+0

Это зависит от того, насколько сложным будет ваш вход. Я бы создал DSL, чтобы объявить, как ввод действителен, и создать объекты, представляющие этот DSL, а затем сказать, чтобы подтвердить этот ввод. –

ответ

2

Как насчет

if (!fulfills_condition_1) throw BadInput(error_message_1); 
if (!fulfills_condition_2) throw BadInput(error_message_2); 
if (!fulfills_condition_3) throw BadInput(error_message_3); 

/* process message */ 

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

1

Я предлагаю вы можете использовать «раннее возвращение» метод:

if (!fulfills_condition_1) 
    // error msg here. 
    return; 

    // fulfills_condition1 holds here. 

    if (!fulfills_condition_2) 
    // error msg here. 
    return; 

    // Both conditon1 and condition2 hold here. 

    if (!fulfills_condition_3) 
    // error msg here. 
    return. 
2

Если что беспокоит вас каскадных if с, вы могли бы пойти на одно из следующих действий:

Использование булево:

bool is_valid = true; 
string error = ""; 
if (!condition_one) { 
    error = "my error"; 
    is_valid = false; 
} 

if (is_valid && !condition_two) { 
    ... 
} 

... 

if (!is_valid) { 
    cout << error; 
} else { 
    // Do something with valid input 
} 

Использование исключений:

try { 
    if (!condition_one) { 
    throw runtime_error("my error"); 
    } 

    if (!condition_two) { 
    ... 
    } 

    ... 

} catch (...) { 
    // Handle your exception here 
} 
1

Если это собирался повторно использовать в нескольких местах, я бы сделал DSL:

Validator inputType1Validator = 
    Validator.should(fulfill_condition_1, error_message_1) 
      .and(fulfill_condition_2, error_message_2) 
      .and(fulfill_condition_3, error_message_3) 

inputType1Validator.check(input); 
Смежные вопросы