我希望简化这个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语句之外,还有其他方法吗?
答案 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。
但是,如果你想把所有东西放在一个单一的话,那么我就不会在条件上看到任何明显的冗余,以缩短它。
如果你想让它更具可读性,你可以使用变量代替函数调用。