C++ 简化语句

C++ 简化语句,c++,qt,logic,C++,Qt,Logic,我想简化这个if语句,使其更“易于阅读” void NewFan::checkData() { if(!ui->firstNameEdit->text().isEmpty() && !ui->lastNameEdit->text().isEmpty() && (!ui->peselEdit->text().isEmpty() && (ui->birthDateEdit->

我想简化这个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语句,还有其他方法吗

将其分为几个部分:

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);
}

这还允许您在进行验证时生成错误消息。

如果您希望使其更具可读性,我将使用嵌套ifs

但是,如果你想把所有的东西都放在一个单一的地方,那么我看不到任何明显的冗余条件来缩短它


如果您想让它更具可读性,您可以使用变量而不是函数调用。

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

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))
  //
inline bool notEmpty(编辑常量*e)
{
return!e->text()->isEmpty();
}
模板
bool notEmpty(编辑常量*e,参数常量*…参数)
{
返回notEmpty(e)和¬Empty(args…);
}
if(notEmpty(foo、bar、baz))
//

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

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);        
}

您可以用变量(bool)替换函数调用。另一个选项:重新设计GUI并触发每个控件的更改。例如,当firstNameEdit变为空时立即禁用按钮。这与OP的代码相比并不理想,因为它会检查所有条件,即使
valid
已经
false
。最好创建一个函数
isValid()
,它将立即返回
false
,而不是设置一个标志。或者只需执行
valid=valid&&!。。。isEmpty();有效=有效&&!。。。isEmpty()或更简单的使用
否则如果
这也可用于将无效LineEdit的背景设置为淡红色,以便用户更清楚地知道应该修复哪些背景