crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

Анна
  опции профиля:
сообщение 30.11.2018, 17:27
Сообщение #1


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

Спасибо сказали: 30 раз(а)




Репутация:   4  


Есть у меня огромная структура, которая представляет из себя внутренности некоторого устройства.
Изначально требовалось приложение, которое скачивает в эту структуру из устройства значения, что-то меняет, записывает обратно.
Потом появилась надобность в другом приложении, пользующемся этой же структурой, потом ещё одно приложение...

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

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

class Interface
{
...
   void setManager(Manager *m) {m_manager = m;};
   void foo1();
   void foo2()
...
   Manager *m_manager;
};

Interfase::foo1()
{
   m_manager->setValueA(val);
}

Interface::foo2()
{
   int val = m_manager->valueA();
}



у меня получились :

class Interface
{
...
   void foo1();
public slot:
   void foo2(int);

signal:
   void valueARequired(); // интерфейсу требуется значение A
   void valueAChanged(int); // интерфейс изменил значение A

...
};


void Intreface::foo1()
{
...
   emit valueAChanged(val);
}

Interface::foo2(int a)
{
   int val = a;
...
}


Ну, и, конечно же, есть в главном окне штабеля коннектов:

connect(interface, SIGNAL(valueAChanged(int)), manager, SLOT(setValueA(int))); 
connect(interface, SIGNAL(valueAChanged(int)), manager, SLOT(setValueA(int))); 
connect(manager, SIGNAL(valueAChanged(int)), interface, SLOT(foo2(int))); 
...


Классов типа Interface несколько (они абсолютно разные. Среди них есть и QWidget и QObject), каждому нужны различные значения из структуры, спрятанной в Manager, каждый хочет какие-то поля менять и получать уведомления об изменениях.
Мне вот интересно, это нормально нормальный подход к решению - всё решать через сигнал-слот, или нужно всё-таки делать гибрид, когда есть и обращение к менеджеру через указатель и с помощью сигналов, слотов и connect()? И, вообще, когда какое решение лучше применять? По ходу, получается паттерн Наблюдатель, но только оба класса являются взаимными Наблюдателями.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 31.5.2025, 22:28