Russian Qt Forum
Ноябрь 24, 2024, 09:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Гуй для параметров, ограниченных констрейнами  (Прочитано 5977 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« : Август 30, 2012, 23:13 »

Добрый всем день Улыбающийся

Обращаюсь с вопросом по архитектуре - очень хотелось бы услышать Ваше мнение Улыбающийся
В общем, дело такое - есть девайс, имеющий N параметров. Каждый параметр - это некая величина, задаваемая во внутренних единицах, и имеющая определенные интервалы значений (например 100...1023 и т.д.).
Необходимо предоставить пользователю гуй с возможностью редактирования данных параметров. Однако на гуе они должны быть представлены не в единицах, понимаемых девайсом, а, скажем, в процентах от 0 до 100%. Собственно, технически реализовать все это не проблема, вопрос больше в том, какой подход лучше использовать.

Сейчас имеется 2 варианта решения.
1 - вместе со значением параметра в гуй передаются его границы (constrains). Гуй отображает, скажем, QSlider с учетом данных ограничений, выводя пользователю пересчитанное в процентах значение параметра (т.е. например если мы имеем границы -50..+50 и значение +25, то на гуе будет отображено 75% и т.д.). При передаче измененного пользователем значения в класс девайса, гуй просто отдаст физическое значение величины, которое может быть записно в железо "как есть".

2 - гуй ничего не знает о границах параметров. Его интерфейс принимает значения в интервале 0...1, что соответстувет 0...100%, и отдает в таком же виде. Пересчетом занимается класс девайса.

Лично я больше за 1 вариант, т.к. он мне кажется более простым и универсальным - класс девайса ничего не знает о том, какие значения видит пользователь. Гуй, в свою очередь, получает реальные значения и может делать с ними, что угодно (показать как есть, в процентах, или еще как-то). К тому же класс девайса освобождается от пересчета значений, а значит, количества ошибок Улыбающийся

Вариант 2, имхо, имеет преимущество, только если параметры нелинейны и пересчет значений в проценты нетривиален (хотя при желании это можно тоже отдать гую).

Кто что думает, колееги? Улыбающийся
« Последнее редактирование: Август 30, 2012, 23:15 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #1 : Август 31, 2012, 08:28 »

Счастливый человек - видимо все другие проблемы уже решены и остаётся заниматься только терзаться такими муками выбора Улыбающийся.
С моей точки зрения оба варианта имеют право на жизнь. В любом случае это кто-то должен переводить значения в проценты и обратно: либо это будет gui часть, либо девайс. Мне больше нравится вариант 2 (почти цитата): "Лично я больше за 2 вариант, т.к. он мне кажется более простым и универсальным - gui ничего не знает о том, какие там единицы измерения используются внутри девайса и как их преобразовывать в проценты."
Записан
Serr500
Гость
« Ответ #2 : Август 31, 2012, 09:11 »

Вариант №2.
Записан
Странник
Гость
« Ответ #3 : Август 31, 2012, 09:24 »

первый вариант более гибкий в том плане, что вы не затрагивая класса устройства сможете изменить способ представления данных в GUI, отображая как проценты, так и физические величины. если исходя из специфики задачи этого совершенно точно не понадобится - используйте второй вариант.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Август 31, 2012, 10:18 »

Странник, переключение между представлением параметров, скорее всего, понадобится - нужен будет вид "для пользователя" и "для инженера".

В варианте 2 я вижу 2 недостатка - во первых, если параметров много и у каждого свои границы, то придется делать N разных пересчетов в классе девайса, что может привести к багам (вместо того, чтоб 1 раз сделать это в гуе). Во вторых, добавляется еще один "уровень" - пересчет из внутренних величин в альфу (0..1), потом в гуе пересчет альфы в проценты.

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

xokc, дело не в том, что я "Счастливый человек" Улыбающийся Просто изначально нужно сделать универсальную архитектуру, чтоб потом 100 раз не патчить Улыбающийся

Serr500, а можешь обосновать, почему 2?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Akon
Гость
« Ответ #5 : Август 31, 2012, 10:33 »

Цитировать
Счастливый человек - видимо все другие проблемы уже решены и остаётся заниматься только терзаться такими муками выбора .
Имхо, это достаточно серьезно, в том смысле, что казалось бы мелочь, но если встречается то тут, то там, и в одном месте вы сделали так, а в тругом несколько иначе, то такой код шумит, и это плохо!

Есть мнение, что если некий функционал полностью выражается через паблик интерфейс класса, то его не нужно реализовывать в этом классе (например, см. как Герб Саттер ощипал std::string в пользу свободных фукций).

Поэтому, если выделить преобразование величин в отдельный класс, то получится более сфокусированная архитектура (см. Low Coupling/High Cohesion): например, клиенты девайса, которым не нужно это преобразование, не получают его в нагрузку.

Для неоткровенных ортодоксов вариант 2 вполне приемлем на практике. Вариант 1 содержит бизнес-логику в гуе.
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #6 : Август 31, 2012, 10:51 »

переключение между представлением параметров, скорее всего, понадобится - нужен будет вид "для пользователя" и "для инженера".
Если есть такое требование, то всё, похоже, сводится к классическому MVC - одна модель и несколько вью для неё. Т.е. появляется вариант № 3, как уже и сказал Akon: выделить преобразование величин в отдельный класс.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Август 31, 2012, 10:57 »

Akon, в гуе нет бизнес логики, он только выполняет преобразования, нужные для визуализации данных, на основе границ, полученных для конкреных параметров. Все дальнейшие операции выполняет класс девайса.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #8 : Август 31, 2012, 11:17 »

Спасибо за участие, коллеги! У нас сейчас ситуация 50 на 50, часть народа за 1, часть за 2 вариант Улыбающийся Пока имплементировали 2, но как то кривовато... "будем думать"...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Август 31, 2012, 11:18 »

(например, см. как Герб Саттер ощипал std::string в пользу свободных фукций).
Как же он его ощипал? Если нетрудно киньте ссылку. Спасибо

Для неоткровенных ортодоксов вариант 2 вполне приемлем на практике. Вариант 1 содержит бизнес-логику в гуе.
В какой-то мере содержит, но отображать "только проценты" и/или значения 0..1 вряд ли устроит. Поэтому я за вариант 1. По ходу дела возникают такие коллизии

- есть параметр с типичным диапазоном использования напр 1..10. Однако редко, но все же бывает что потребовалось значение напр 20, это не запрещено. Если абсолютные значения предъявлены - проблемы нет

- к сожалению, при большом числе параметров места на слайдеры часто не хватает
Записан
Serr500
Гость
« Ответ #10 : Август 31, 2012, 12:14 »

Serr500, а можешь обосновать, почему 2?
С моей точки зрения он более правильный. Этот подход разделяет вид и реализацию. В виде (view) пользователь выставляет проценты, поэтому пусть вид и оперирует тем, что меняет пользователь. А внутренняя реализация класса уже оперирует своими абсолютными значениями. Это "развязывает" вид и реализацию, они оказываются независимыми. Вид не имеет понятия о реализации, что позволяет ему не меняться при её смене. Например, если вместо диапазона -50...+50 вдруг придётся использовать диапазон -100500...+100500, придётся менять не только реализацию, но и вид. Во втором случае вид вообще не будет затронут. А функции-преобразователи процентов в абсолютные значения будут очень простыми и быстро выполняющимися. Фактически, класс при таком подходе предоставляет некоторый интерфейс, независимый от своей внутренней реализации.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #11 : Август 31, 2012, 12:24 »

Serr500, основная идея варианта 1 в том, что гую передается И параметр, И его диапазон. Т.е. гуй в любом случае неизменен - он знает, что пришло значение, например, 15, и интервал -5..35. Тогда он просто отображает процентное значение как 50%. Если интервал изменится - гуй прочитает его, опять же, из класса девайса, но код его в любом случае не будет меняться.

Igors, да, скорее всего, надо будет отображать И проценты, И внутреннюю величину (для инженеров).
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #12 : Август 31, 2012, 12:43 »

С моей точки зрения он более правильный. Этот подход разделяет вид и реализацию.
Ой да как мы умеем "обосновать", "подвести базу" и.т.п. Улыбающийся Понятно что "2" для программиста заметно легче и обобщается гораздо лучше. Вот только у пользователя свои запросы с которыми надо (разумно) считаться.

Igors, да, скорее всего, надо будет отображать И проценты, И внутреннюю величину (для инженеров).
Ну проценты показывать необов'язково - по позиции слайдера понятно. Но отделаться "диапазоном" вряд ли удастся, там налипает гораздо больше: тип данных (хотя бы int/float), дефаулт значение, разрешен ли выход за диапазон и.т.п. В общем, забот хватит если делать для людей, а не играться в красивые абстрактные конструкции  Улыбающийся
Записан
Akon
Гость
« Ответ #13 : Август 31, 2012, 12:56 »

Цитировать
Как же он его ощипал? Если нетрудно киньте ссылку. Спасибо
Это в его книге "Новые сложные задачи ..." (называется как-то так). Если не ошибаюсь, раздел "Ослабленная монолитность".

Цитировать
Akon, в гуе нет бизнес логики, он только выполняет преобразования
А преобразование это не бизнес-логика? Ок, пусть параллельно с гуем будет консольный интерфейс и в нем будет интерактивный запрос "Введите значение параметра ХХХ в %:". А теперь смотрим стереотипные фрагменты кода в гуе и в консоли... (это будет преобразование)
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #14 : Август 31, 2012, 14:23 »

А преобразование это не бизнес-логика?
Нет, т.к. это преобразование необходимо только для визуализации. Алгоритмика его не требует.

В случае нескольких разнотипных гуев, все равно будет необходим пересчет альфы в проценты и назад. Тут надо его либо выносить отдельно, ваша правда Улыбающийся, либо, как вариант, каждому такому гую отнаследоваться от класса преобразователя.

Понятно что "2" для программиста заметно легче и обобщается гораздо лучше. Вот только у пользователя свои запросы с которыми надо (разумно) считаться.
Не знаю, мне бы было легче именно "1" реализовать. Т.к. если у меня, скажем, 10 разных девайсов, то для каждого придется писать свое преобразование (или наследоваться от общего класса), гую же это не надо (если он один).

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

Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.067 секунд. Запросов: 23.