C++ 简化语句
我想简化这个if语句,使其更“易于阅读”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->
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的背景设置为淡红色,以便用户更清楚地知道应该修复哪些背景