2010-02-24 2 views
22

Мы используем Qt, который предлагает сигналы и слоты, которые я нахожу действительно удобный. Однако, с большой силой приходит большая ответственность, и я думаю, что это очень легко злоупотреблять этой функцией.Когда использовать сигналы и слоты, а не

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

  • Можно ли использовать сигналы для сообщения об ошибках?
  • Можно ли предположить, что сигнал будет обработан?
  • Может ли сигналы использоваться для инициирования действий? Например. signal displayInfoScreen() должен обрабатываться слотом, который отображает информационный экран.

Любые другие мнения о том, когда сигналы должны/не должны использоваться, являются очень приветствуются!

ответ

12

Это нормально использовать сигналы, чтобы сообщить
ошибки?

Да, например, см. QFtp, где выполненный сигнал имеет статус. Он не несет фактическую ошибку, просто информацию о том, что произошла ошибка.

Можно ли предположить, что сигнал будет обрабатываться ?

Нет. Отправитель никогда не может предположить, что, однако, ваше конкретное приложение может зависеть от него. Например, QAction, представляющий File-New, нужно обрабатывать, чтобы приложение работало, но объект QAction не волновался.

Могут ли сигналы использоваться для инициирования действий? Например. сигнал displayInfoScreen() должен обрабатываться слотом, который отображает информационный экран.

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

+0

Принято, поскольку в этом ответе приведены простые примеры использования в Qt. Вы считаете, что ошибки в порядке, но только тогда, когда обработка является асинхронной? – larsmoa

+0

Спасибо! И, да, в противном случае добавьте либо возвращаемое значение состояния, либо аргумент состояния (как QString :: toInt). – e8johan

10

Можно ли предположить, что сигнал будет обработан?

Нет, это не так. Сигналы являются огнем и забывают о вещах. Кто подключается к сигналу и что он делает, не должен заботиться об эмитенте.

3

Сигналы/слоты (также называемые событиями) являются хорошим способом удаления связи между объектами.

Например, вместо того, чтобы иметь представления, которые понимают, как работает модель, и когда модель изменяется, они «слушают» модель. Модель отвечает за то, чтобы сказать, когда она изменится, какие изменения.

Проблема с событиями заключается в том, когда вы разрабатываете свои мероприятия с учетом требований клиентов. Например, вы не должны иметь сигнал displayInfoScreen, потому что он принимает что-то об объектах, используя этот сигнал. Вместо этого он должен быть infoChanged, а InfoScreenDisplayer прослушивает эти сигналы, чтобы отобразить его на экране. Если вам нужно, вы можете добавить позже InfoTweeterPoster, которые публикуют информацию о Tweeter всякий раз, когда они меняются.

+6

Вы пишете события a.k.a., но это не так. Qt поставляется с отдельной инфраструктурой событий. – e8johan

11

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

Основным недостатком конструкции на основе сигнала/слота является то, что вы можете очень легко избавиться от логики, которую вы внедрили, поскольку одно действие объекта может инициировать другие действия любого другого объекта, подключенного к выходу сигнала. Гораздо проще иметь нежелательные побочные эффекты, рекурсивные вызовы и т. Д.

5

Можно ли использовать сигналы для сообщения об ошибках?

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

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

Можно ли предположить, что сигнал будет обработан?

Сигналы (философски) предназначены для обозначения того, что что-то произошло. Как указывали другие, никогда не рекомендуется предполагать, что сигнал будет соответствовать слоту или даже только один другой слот.

Может ли сигналы использоваться для инициирования действий? Например. Сигнал displayInfoScreen() должен обрабатываться слотом, который отображает информационный экран.

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