Рефакторинг кода в Qt (C++)

552
06 января 2018, 03:17

Здравствуйте, задался довольно-таки очень простым вопросом... Нельзя ли сделать более красивую проверку полей формы на пустое значение, к примеру вот:

if(ui->editName->text().isEmpty() || ui->editDateOfBirth->text().isEmpty() || ui->editAddress->text().isEmpty() ||
    ui->editPersonalData->text().isEmpty() || ui->editPhoneNumber->text().isEmpty())
{
    QMessageBox::warning(0, "Ошибка", "Введены не все данные.");
    return;
}
Answer 1

ИМХО, хуже чем "Введены не все данные" может быть только "Не правильные данные" + очистка формы.

Не мучайте своих пользователей сделайте:

if(ui->editName->text().isEmpty()){
    QMessageBox::warning(0, "Ошибка", "Введите имя");
    return;
}
if(ui->editDateOfBirth->text().isEmpty()){
    QMessageBox::warning(0, "Ошибка", "Введите дату рождения");
    return;
}
//...

Если пользователей не жалко. Можно так:

//Добавляем поле класса с полями ввода
QList<QLineEdit*> inputs;
//Где-то в конструкторе укладываем все проверяемые поля в список
inputs.append(ui->editName);
inputs.append(ui->editDateOfBirth);
//В каком-то методе
auto isEmpty = [](QLineEdit *input){return input->text().isEmpty();};
if(std::any_of(inputs.begin(), inputs.end(), isEmpty)){
    QMessageBox::warning(0, "Ошибка", "Введены не все данные.");
    return;
}
Answer 2

Ну что-нибудь вроде C++17 fold expression:

template<typename... TPointerToWidget> bool
someIsEmpty(TPointerToWidget... p_widget)
{
    return(p_widget->text().isEmpty() || ...);
}
if(someIsEmpty(ui->editName, ui->editDateOfBirth, ui->editAddress, ui->editPersonalData, ui->editPhoneNumber))

Как альтернатива можно решить этот вопрос принципиально, задавая свойства валидации для каждого поля, а затем пробегаясь по всем полям.

Если тип у всех полей одинаковый, то можно сделать вот такой вариант C++11

bool
someIsEmpty(::std::initializer_list<QEdit *> const & pointers_to_edits)
{
    for(auto const & p_edit: pointers_to_edits)
    {
        if(p_edit->text().isEmpty())
        {
            return(true);
        }
    }
    return(false);
}
if(someIsEmpty({ui->editName, ui->editDateOfBirth, ui->editAddress, ui->editPersonalData, ui->editPhoneNumber}))
Answer 3

Оберни в метод:

bool Form::isDataValid() {
    return !ui->editName.isEmpty()         &&
           !ui->editDateOfBirth.isEmpty()  &&
           !ui->editAddress.isEmpty()      &&
           !ui->editPersonalData.isEmpty() &&
           !ui->editPhoneNumber.isEmpty();
}
//....
if(!isDataValid())
{
    QMessageBox::warning(0, "Ошибка", "Введены не все данные.");
    return;
}
Answer 4
bool isSomeEmpty(const QList<QLineEdit *> &_list)
{
    for(QLineEdit *_edit : _list)
    {
        if(_edit->text().isEmpty())
        {
            return true;
        }
    }
    return false;
}
void MainWindow::on_pushButton_clicked()
{
    if(isSomeEmpty(
    {
        ui->editAddress,
        ui->editDateOfBirth,
        ui->editName,
        ui->editPersonalData,
        ui->editPhoneNumber
    }))
    {
        QMessageBox::warning(0, "Ошибка", "Введены не все данные.");
        return;
    }
}
READ ALSO
Приведение типов умных указателей C++

Приведение типов умных указателей C++

А можно ли привести тип умного указателя родительского класса к дочернему? К примеру есть есть базовый класс Models и от него наследуется класс...

297
Связные списки в с++

Связные списки в с++

Очень сложно разобраться со связными списками( Помогите разобраться в этой части кода,пожалуйста:

350
Содержимое указателя

Содержимое указателя

Немного запутался:

235
Поиск максимальной суммы в подмассиве

Поиск максимальной суммы в подмассиве

Дан массив, требуется найти такой подмассив с максимальной суммой элементов в нем, чтобы начало и конец отрезка были одинаковыми(вывести...

264