2010-02-24 22 views
22

Usiamo Qt che offre segnali e slot che trovo davvero conveniente. Tuttavia, con un grande potere derivano grandi responsabilità e penso che sia molto facile anche abusare di questa funzione.Quando utilizzare segnali e slot e quando non a

Esistono buone pratiche per l'utilizzo dello slot di segnalazione? Sto attraversando un periodo difficile per trovare alcune linee guida generali in questo modo. Alcune domande (ho opinioni chiare a riguardo, ma non tutti i membri del mio team sono d'accordo):

  • È ok utilizzare i segnali per segnalare errori?
  • Va bene supporre che verrà gestito un segnale?
  • È possibile utilizzare i segnali per avviare azioni? Per esempio. signal displayInfoScreen() deve essere gestito da uno slot che mostra una schermata informativa.

Qualsiasi altro parere su quando i segnali dovrebbero/non dovrebbero essere utilizzati sono molto benvenuto!

risposta

12

E 'ok per utilizzare segnali di segnalare
errori?

Sì, ad esempio, vedere QFtp, dove il segnale di completamento ha uno stato. Non porta l'errore effettivo, solo le informazioni che si è verificato un errore.

Va bene supporre che un segnale sarà gestito?

No. Il mittente non può mai presumere che, tuttavia, la vostra particolare applicazione può dipendere da esso. Ad esempio, la QAction che rappresenta File - Nuova deve essere gestita affinché l'applicazione funzioni, ma l'oggetto QAction non può fregare di meno.

È possibile utilizzare i segnali per avviare le azioni ? Per esempio. signal displayInfoScreen() deve essere gestito da uno slot che mostra una schermata informativa.

Ancora, sì, ad esempio l'oggetto QAction. Ma se vuoi essere in grado di riutilizzare i componenti, devi fare attenzione a garantire che la classe reale non dipenda da essa.

+0

Accettato in quanto questa risposta fornisce semplici esempi di utilizzo in Qt. Pensi che gli errori siano ok, ma solo quando l'elaborazione è asincrona? – larsmoa

+0

Grazie! E, sì, altrimenti, aggiungi un valore di ritorno dello stato o un argomento di stato (come fa QString :: toInt). – e8johan

10

Va bene supporre che verrà gestito un segnale?

No, non lo è. I segnali sono tipo fuoco-e-dimenticano di cose. Chi si connette a un segnale e ciò che fa non dovrebbe essere la preoccupazione dell'emettitore.

3

I segnali/slot (detti anche eventi) sono un buon modo per rimuovere l'accoppiamento tra gli oggetti.

Ad esempio, invece di avere viste che capiscono come funziona il modello, e quando il modello cambia, "ascoltano" il modello. Il modello è responsabile di dire quando cambia, cosa cambia.

Il problema con gli eventi è quando si progettano i propri eventi con i requisiti del cliente. Ad esempio, non si dovrebbe avere un segnale displayInfoScreen perché assume qualcosa sugli oggetti che usano questo segnale. Invece, dovrebbe essere infoChanged e il InfoScreenDisplayer ascolta questi segnali per visualizzarli sullo schermo. Se necessario, è possibile aggiungere in seguito un InfoTweeterPoster che pubblica le informazioni su Tweeter ogni volta che cambiano.

+6

Scrivi eventi a.k.a., ma ciò non è vero. Qt viene fornito con un'infrastruttura eventi separata. – e8johan

11

I segnali e gli slot sono potenti perché disaccoppiano gli oggetti. Non si può presumere che un segnale abbia uno slot collegato, come precedentemente risposto.

grave inconveniente di progettazione basata segnale/slot è che si può pista molto facile libera della logica che si implementato, perché un'azione di un oggetto può attivare altre azioni di qualsiasi altro oggetto che collegato ad un segnale emesso. È molto più facile avere effetti collaterali indesiderati, chiamate ricorsive, ecc.

5

È corretto utilizzare i segnali per segnalare errori?

Sì, ma generalmente lo rendere dipendente dalla situazione. Se l'errore può verificarsi in modo asincrono, allora un segnale per indicare tale è sicuramente corretto. Se l'errore si verifica solo quando il codice client chiama una determinata funzione, allora l'errore dovrebbe essere nella risposta da quella funzione, non come un segnale. Tuttavia, vi è una vasta gamma di situazioni intermedie che potrebbero essere fatte caso per caso.

Inoltre, i meccanismi di slot di segnale possono facilitare la comunicazione tra thread (che potrebbe essere considerato il caso asincrono) e li userò a tale scopo (errore o no).

Va bene supporre che verrà gestito un segnale?

I segnali sono (filosoficamente) progettati per indicare che qualcosa è accaduto. Come altri hanno indicato, non è mai una buona idea presumere che un segnale sarà abbinato a uno slot, o anche con solo uno slot.

È possibile utilizzare i segnali per avviare azioni? Per esempio. signal displayInfoScreen() deve essere gestito da uno slot che mostra una schermata informativa.

I segnali possono essere utilizzati per avviare azioni, ma probabilmente non nel modo in cui si sta pensando. Il segnale indica che pippo è successo. Se il codice che controlla la tua classe decide che quando si verifica foo, dovrebbe essere visualizzata una finestra di dialogo, quindi il segnale è stato utilizzato per avviare tale azione. Tuttavia, in genere non è responsabilità della classe che emette il segnale per garantire che si verifichi l'azione appropriata, poiché non è responsabile di tale azione. (Se così fosse, allora dovrebbe essere parte della stessa classe, e nessun segnale sarebbe necessaria.)

Problemi correlati