简化声明

时间:2014-08-29 09:02:38

标签: c++ qt logic

我希望简化这个if语句更加“人类可读”

void NewFan::checkData()
{
    if(!ui->firstNameEdit->text().isEmpty() && !ui->lastNameEdit->text().isEmpty() &&
            (!ui->peselEdit->text().isEmpty() && (ui->birthDateEdit->text().size()==10 &&
             !ui->townEdit->text().isEmpty() && !ui->addressEdit->text().isEmpty()) ||
             ui->peselEdit->text().size()==11))
        ui->addButton->setEnabled(true);
    else
        ui->addButton->setDisabled(true);
}

除了将其重写为嵌套if语句之外,还有其他方法吗?

4 个答案:

答案 0 :(得分:3)

您可以将一些非空案例分组

inline bool notEmpty(Edit const* e)
{
  return !e->text()->isEmpty();
}

template<typename... Args>
bool notEmpty(Edit const* e, Args const*... args)
{
  return notEmpty(e) && notEmpty(args...);
}

if (notEmpty(foo, bar, baz))
  //

答案 1 :(得分:3)

如果人类的可读性是您的追求,那么您应该将复杂的条件分解为易于理解的位

void NewFan::checkData()
{
  bool firstname_ok = !ui->firstNameEdit->text().isEmpty();
  bool lastname_ok  = !ui->lastNameEdit->text().isEmpty();
  bool birthdate_ok =  ui->birthDateEdit->text().size() == 10;
  bool town_ok      = !ui->townEdit->text().isEmpty();
  bool address_ok   = !ui->addressEdit->text().isEmpty();
  bool pesel_ok     =  ui->peselEdit->text().size() == 11;
  bool pesel_alt_ok =  birthdate_ok && town_ok && address_ok;

  bool can_add      = firstname_ok && lastname_ok && (pesel_ok || pesel_alt_ok);

  ui->addButton->setEnabled(can_add);        
}

答案 2 :(得分:2)

将其分成几个部分:

void NewFan::checkData()
{
    bool valid = true;
    if(ui->firstNameEdit->text().isEmpty())
        valid=false;
    if(ui->lastNameEdit->text().isEmpty())
        valid=false;
    if(!ui->peselEdit->text().isEmpty())
        valid=false;
    if((ui->birthDateEdit->text().size()==10 &&
             !ui->townEdit->text().isEmpty() && !ui->addressEdit->text().isEmpty()) ||
             ui->peselEdit->text().size()==11)
        valid=false;

    ui->addButton->setEnabled(valid);
}

这也允许您在进行验证时构建错误消息。

答案 3 :(得分:1)

如果你想让它更具可读性,我会使用嵌套的ifs。

但是,如果你想把所有东西放在一个单一的话,那么我就不会在条件上看到任何明显的冗余,以缩短它。

如果你想让它更具可读性,你可以使用变量代替函数调用。