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

这些条件的数量有可能会增加,我想知道是否有一种更简洁的方法来使用 switch 或类似的东西来表示这一点,而不是使用大量的级联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语句确实有效 - 但一般来说有更好的方法吗?

4

4 回答 4

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 */

然后您的异常处理程序可以报告错误消息,并根据需要重试或中止。

于 2013-03-14T08:58:43.647 回答
2

如果困扰您的是级联ifs,您可以选择以下方法之一:

使用布尔值:

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
}
于 2013-03-14T08:59:23.650 回答
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.
于 2013-03-14T08:58:36.727 回答
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);
于 2013-03-14T09:08:16.613 回答