Когда использовать сигналы и слоты, а когда нет

StackOverflow https://stackoverflow.com/questions/2325148

Вопрос

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

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

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

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

Это было полезно?

Решение

Нормально ли использовать сигналы для составления отчетов
ошибки?

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

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top