【问题标题】:Simplify statement简化语句
【发布时间】:2014-10-23 06:33:20
【问题描述】:

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

【问题讨论】:

  • 您可以将函数调用替换为变量 (bool)。
  • 另一种选择:重新设计您的 GUI 并触发每个控件的更改。例如,一旦 firstNameEdit 为空,就禁用您的按钮。

标签: c++ qt logic


【解决方案1】:

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

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】:

    也许你可以对一些非空的情况进行分组

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

    【讨论】:

      【解决方案3】:

      把它分成几个部分:

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

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

      【讨论】:

      • 与 OP 的代码相比,这不是最优的,因为即使 valid 已经是 false,它也会检查所有条件。最好创建一个函数isValid(),它会立即返回false,而不是设置一个标志。
      • 或者直接做valid = valid &amp;&amp; !...isEmpty(); valid = valid &amp;&amp; !...isEmpty(); ...
      • 或者更简单的使用else if
      • 这也可以用来将无效的LineEdit的背景设置为偏红的颜色,让用户更清楚哪些应该修复
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-12
        • 1970-01-01
        • 1970-01-01
        • 2018-12-01
        • 2018-12-24
        相关资源
        最近更新 更多