Russian Qt Forum

Программирование => Общий => Тема начата: Igors от Июнь 08, 2020, 10:54



Название: Дескриптор параметра
Отправлено: Igors от Июнь 08, 2020, 10:54
Добрый день

Есть ф-ция (псевдокод)

Код
C++ (Qt)
bool UpdateEditValue(
  QLineEdit * edit,   // UI виджет
  FilterType filter,    // тип фильтра (напр UNSIGNED_FLOAT)
  float * value,        // модифицируемое значение
  float min, max, default,    // пределы  
  const QString & name );  // имя поля
 
Ф-ция возьмет значение из QLineEdit, выполнит все проверки, если все норм - запишет value, иначе вывалит сообщение об ошибке (поэтому нужен аргумент "name")

В принципе ф-ционал нормальный, но хотелось бы его расширить и сделать использование более компактным. Как это сделать ?

Спасибо



Название: Re: Дескриптор параметра
Отправлено: Пантер от Июнь 08, 2020, 11:12
Код
C++ (Qt)
class IValidatorUpdater {/* place here basic public methods */}
 
bool UpdateEditValue(QLineEdit *edit, float *value, const QStrning &name, IValidatorUpdater *vu);
 
И дальше передавай класс с нужной фнукциональностью.


Название: Re: Дескриптор параметра
Отправлено: Igors от Июнь 08, 2020, 17:19
Код
C++ (Qt)
class IValidatorUpdater {/* place here basic public methods */}
 
bool UpdateEditValue(QLineEdit *edit, float *value, const QStrning &name, IValidatorUpdater *vu);
 
И дальше передавай класс с нужной фнукциональностью.
Хмм... ну и во что это вольется? Сейчас вызов выглядит
Код
C++ (Qt)
if (UpdateEditValue(edit, UNSIGNED_FLOAT, &data->mBias, 0.0f, 1.0f, 0.5f, "Bias")) ..
 
Терпимо, но длинновато (достаточно громоздко). Предлагается

Код
C++ (Qt)
MyUpdater updater(0.0f, 1.0f, 0.5f);
...
if (UpdateEditValue(edit, &data->mBias, "Bias", &updater)) ..
 
Возможно есть смысл хранить мапу <QLineEdit *, IValidatorUpdater *> в классе окна. Ну может и компактнее, но не особо. И ф-ционал IValidatorUpdater ограничен т.к. он не имеет указателя на данные и name.

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

1) Почему только QLineEdit? Попапок и чекбоксов тоже хватает. Но тогда придется делать извлечение из виджета всяко-разно. Напр чекбокс может соответствовать (в данных) bool или int или битовому флагу

2) Почему конкретный "float"? Конечно есть и int и double и разнообразные enum'ы. Template напрашивается, но тогда опять возня с извлечением: toInt или toDouble или как?

3) Ну и подача адреса данных неприятно режет глаз. Нужен public, положили на геттеры/сеттеры. Но они ведь у каждого класса данных свои, как обобщать? Поэтому часто приходится вызовы UpdateEditValue оборачивать (геттером в локальную, если вернула true то сеттер)

Конечно все это можно пережить, но это неаккуратно. Как разложить все по полочкам?


Название: Re: Дескриптор параметра
Отправлено: Пантер от Июнь 08, 2020, 17:35
1. Ты можешь написать свой класс FloatUpdater
2. Определи основной абстрактный интерфейс, чтобы туда можно было и QWidget* передавать, и name
3. Опиши основную логику в UpdateEditValue и остальное отдай на откуп валидатору
4. Напиши базовый валидатор с основной функциональностью.
Как-то так. Тут нужно отталкиваться от задачи, которая перед тобой стоит и от того, сколько всяких вариантов использования может быть. Я тебе дал направление, дальше думай сам.


Название: Re: Дескриптор параметра
Отправлено: Igors от Июнь 09, 2020, 10:10
1. Ты можешь написать свой класс FloatUpdater
2. Определи основной абстрактный интерфейс, чтобы туда можно было и QWidget* передавать, и name
3. Опиши основную логику в UpdateEditValue и остальное отдай на откуп валидатору
4. Напиши базовый валидатор с основной функциональностью.
Как-то так. Тут нужно отталкиваться от задачи, которая перед тобой стоит и от того, сколько всяких вариантов использования может быть. Я тебе дал направление, дальше думай сам.
Эти 1, 2, 3, 4 - это "or" или "and"? Т.е. их надо все реализовать или выбрать на свой вкус ? (как-то не очень ясно)

Задача самая банальная - в UI заполняются поля всяких структур, она хорошо знакома каждому кто делал хоть какое-то UI. В общем о чем я должен думать - так и не понял :)