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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Организация "утилей"  (Прочитано 4349 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Май 04, 2016, 14:01 »

Добрый день

Вот опять возникла эта ситуация. Есть библиотечный класс который надо "обустроить" поудобнее. Напр сейчас класс с мета-данными
Код
C++ (Qt)
class Motion {
...
std::map<std::string, std::string> metaData;
Мне нужно извлечь параметр по ключу "noise_scale", убедиться что значение корректно (флот), иначе использовать какой-то дефаулт. Такие операции массовые, ясно что нужно написать ф-ции утилиты (напр GetNoiseScale) чтобы всякий раз не возюкаться. Но где их поместить, как оформить?

Или даже более упрощенный пример: вот набегают полезные ф-ции для работы с пресловутым QString - ну и куда их девать? Наследоваться от QString явно нехорошо, тогда как?

Спасибо
Записан
kai666_73
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #1 : Май 04, 2016, 16:55 »

Или даже более упрощенный пример: вот набегают полезные ф-ции для работы с пресловутым QString - ну и куда их девать? Наследоваться от QString явно нехорошо, тогда как?
Спасибо

Я бы в библиотеку вынес. Например, Utils, а в ней StringUtils.cpp/StringUtils.h с полезными экспортируемыми функциями...
Или я вопроса не понял?)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Май 05, 2016, 09:32 »

Я бы в библиотеку вынес. Например, Utils, а в ней StringUtils.cpp/StringUtils.h с полезными экспортируемыми функциями...
Хорошо, попробуем так и сделать
Код
C++ (Qt)
// MotionUtils.h
#ifndef MOTION_UTILS_H
#define MOTION_UTILS_H
 
namespace SomeLibrary {
 class Motion;
};
 
double GetNoiseScale( SomeLibrary::Motion * motion, double defaultValue = 0.0 );
void SetNoiseScale( SomeLibrary::Motion * motion, double value );
 
extern const double defaultNoiseScale;
 
#endif // MOTION_UTILS_H
В принципе нормальный вариант, но достаточно ли убедителен вызов/использование просто "GetNoiseScale"? Напр слова "noise" и "scаle" могут быть и никак не связаны с "Motion"
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Май 05, 2016, 09:46 »

Если вы все равно передаете в функции указатель (ссылку) на Motion, т.е. явно привязываете ее к Motion, почему бы не расширить класс Motion такими методами? Для чего делать внешние геттеры/сеттеры, если можно их добавить в сам класс?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Май 05, 2016, 09:52 »

Если вы все равно передаете в функции указатель (ссылку) на Motion, т.е. явно привязываете ее к Motion, почему бы не расширить класс Motion такими методами? Для чего делать внешние геттеры/сеттеры, если можно их добавить в сам класс?
В том-то и дело что класс Motion библиотечный, поддерживается разработчиком либы, и время от времени обновляется, поэтому трогать его как минимум очень нежелательно. Напр добавить свои методы в QString можно, но во что обойдется (пере)сборка всякий раз?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Май 05, 2016, 10:01 »

В том-то и дело что класс Motion библиотечный, поддерживается разработчиком либы, и время от времени обновляется, поэтому трогать его как минимум очень нежелательно. Напр добавить свои методы в QString можно, но во что обойдется (пере)сборка всякий раз?
Тогда это
В принципе нормальный вариант, но достаточно ли убедителен вызов/использование просто "GetNoiseScale"? Напр слова "noise" и "scаle" могут быть и никак не связаны с "Motion"
не проблема.

Можно сделать несколько функций для манипуляций с разными объектами:
Код
C++ (Qt)
double getNoiseScale( const SomeLibrary::Motion &motion, double defaultValue = 0.0 );
void setNoiseScale( SomeLibrary::Motion &motion, double value );
 
double getNoiseScale( const SomeLibrary::Poligon &poligon, double defaultValue = 0.0 );
void setNoiseScale( SomeLibrary::Poligon &poligon, double value );
 

Тогда для манипуляций с одинаковыми параметрами понадобиться одинаковые по имени функции.
« Последнее редактирование: Май 05, 2016, 10:50 от Old » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #6 : Май 05, 2016, 11:46 »

А если таких функций набирается много, можно сделать некий класс враппер:
Код
C++ (Qt)
class MotionHelper
{
public:
   MotionHelper( SomeLibrary::Motion &motion ) : m_motion( motion ) {}
 
   double getNoiseScale( double defVal = 0.0 ) const;
   void    setNoiseScale( double val );
 
private:
   SomeLibrary::Motion &m_motion;
};
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Май 05, 2016, 14:34 »

не проблема.

Можно сделать несколько функций для манипуляций с разными объектами:
Все-таки я сейчас оборачиваю в namespace, а при использовании когда как.
Код
C++ (Qt)
double scale = MotionUtils::GetNoiseScale(motion);
Иной раз длинновато, но имя namespace заметно облегчает понимание. Того же можно добиться сделав класс со всеми методами static (а ля жаба), но тогда уже имя класса придется писать всегда

А если таких функций набирается много, можно сделать некий класс враппер:
Так тоже неск раз пробовал. Вроде логично, но далеко не всегда удается "запастись" хелпером чтобы юзать его многократно, приходится частенько его создавать. а иногда и присматривать не грохнул ли само motion
Код
C++ (Qt)
double scale = MotionHelper(*motion).GetNoiseScale();
Так особого выигрыша нет
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #8 : Май 05, 2016, 19:51 »

Так особого выигрыша нет
Выигрыш будет при сложной настройке Motion:
Код
C++ (Qt)
MotionHelper m( motion );
m.setNoiseScale( 100500 );
m.setPos( ... );
m.setXXX();
 
// или
 
MotionHelper( motion ).setNoiseScale( 100500 ).setPos( ... ).setXXX();
 
« Последнее редактирование: Май 05, 2016, 20:27 от Old » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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