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

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

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

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

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

24
задан Louis Langholtz 20 January 2018 в 10:05
поделиться

5 ответов

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

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

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

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

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

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

13
ответ дан 28 November 2019 в 23:20
поделиться

Mono 2,6 поставляется с DbLinq . Это не удобно, хотя и вы должны пройти через некоторую боль, прежде чем вы можете сделать это работать.

-121--3995615-

Проверьте это на MSDN Как написать простой проект MSBuild .

Ее хорошая статья и помогла мне начать.

Вот pdf печатной версии того же.

-121--746897-

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

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

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

4
ответ дан 28 November 2019 в 23:20
поделиться

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

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

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

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

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

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

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

6
ответ дан 28 November 2019 в 23:20
поделиться

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

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

13
ответ дан 28 November 2019 в 23:20
поделиться

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

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

11
ответ дан 28 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: