Упростить высказывание


Я хочу упростить это утверждение 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?

4   2   2014-08-29 13:02:37

4 ответа:

Разделите его на несколько частей:

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

Это также позволяет создавать сообщение об ошибке по мере прохождения проверки.

Вы можете сгруппировать некоторые непустые случаи, возможно

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

Если человеческая читабельность-это то, что вам нужно, вы должны разбить свое сложное условное условие на легко усваиваемые биты

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

Если вы хотите сделать его более читаемым, я бы использовал вложенные ifs.

Но, если вы хотите сохранить все в одном единственном случае, то я не вижу никакой явной избыточности в условиях, чтобы сделать его короче.

Если вы хотите сделать его более читаемым, вы можете использовать переменные вместо вызовов функций.