简体   繁体   English

简化声明

[英]Simplify statement

I want to simplify this if statement to be more 'human readable' 我希望简化这个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);
}

Is there any other way than rewrite it to nested if statement? 除了将其重写为嵌套if语句之外,还有其他方法吗?

You can group some of the non-empty cases perhaps 您可以将一些非空案例分组

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

If human readability is what your after, you should break down your complex conditional into easy-to-digest bits 如果人类的可读性是您的追求,那么您应该将复杂的条件分解为易于理解的位

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

split it up in several parts: 将它分成几个部分:

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

This also allows you to build an error message as you go through the validation. 这也允许您在进行验证时构建错误消息。

If you want to make it more readable I would use nested ifs. 如果你想让它更具可读性,我会使用嵌套的ifs。

But, if you want to keep everything in one single if then I don't see any apparent redundancy in the conditions to make it shorter. 但是,如果你想把所有东西都放在一个单一的话,那么我没有看到任何明显的冗余条件让它变短。

If you want to make it more readable you can use variables instead of the function calls. 如果要使其更具可读性,可以使用变量而不是函数调用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM