Domanda

Stiamo usando 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.

Ci sono delle migliori pratiche per l'utilizzo del segnale slot? Sto avendo un momento difficile trovare alcune linee guida generali in questo modo. Alcune domande (non ho opinioni chiare su, ma che non tutti i membri della mia squadra sono d'accordo con):

  • E 'ok per utilizzare segnali per segnalare errori?
  • E 'ok per scontato che un segnale verrà gestito?
  • Può segnali essere utilizzati per avviare azioni? Per esempio. signal displayInfoScreen() deve essere gestito da uno slot che mostra una schermata di informazioni.

Tutte le altre opinioni su quando dovrebbe / non devono essere utilizzati i segnali sono molto benvenuti!

È stato utile?

Soluzione

  

E 'ok per utilizzare segnali a riferire
  errori?

Sì, per esempio, vedere QFtp, in cui il segnale fatto comporta uno stato. Non compia l'errore effettivo, solo informazioni che è avvenuto un errore.

  

E 'ok per scontato che un segnale   essere trattati?

No. Il mittente non può mai assumere che, comunque, l'applicazione particolare, può dipendere da esso. Per esempio, il che rappresenta QAction File - Nuovo deve essere gestita per l'applicazione al lavoro, ma l'oggetto QAction non poteva fregare di meno

.
  

segnali possono essere utilizzate per avviare   Azioni? Per esempio. segnale   displayInfoScreen () deve essere gestita dal   uno slot che mostra una schermata di informazioni.

Anche in questo caso, sì, per esempio, l'oggetto QAction. Ma se si vuole essere in grado di riutilizzare i componenti, è necessario essere attenti a garantire che la classe attuale non dipende da esso.

Altri suggerimenti

I segnali e gli slot sono potenti disaccoppia perché gli oggetti. Non si può presumere che un segnale è collegata una fessura, come precedentemente risposto.

Un 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 a un segnale emesso. E 'molto più facile avere effetti collaterali indesiderati, chiamate ricorsive, ecc.

  

E 'ok per scontato che un segnale verrà gestito?

No non lo è. I segnali sono fire-and-forget tipo di cose. Che si connette a un segnale e quello che fa non dovrebbe essere la preoccupazione del emettitore.

  

E 'ok per utilizzare segnali a segnalare errori?

Sì, ma vorrei generalmente rendere questa situazione-dipendente. Se l'errore può verificarsi in modo asincrono, quindi un segnale per indicare quali è sicuramente corretta. Se l'errore si verifica solo quando il codice cliente chiama una certa funzione, allora l'errore dovrebbe essere nella risposta da tale funzione, non come un segnale. Tuttavia, ci sono una vasta gamma di situazioni tra che può essere effettuato su una base caso per caso.

Inoltre, meccanismi segnale slot possono rendere la comunicazione cross-thread facile (che potrebbe anche essere considerato il caso asincrono), e li utilizzerà per tale scopo (errore o no).

  

E 'ok per scontato che un segnale verrà gestito?

I segnali sono (filosoficamente), progettato per indicare che qualcosa è accaduto. Come altri hanno indicato, non è mai una buona idea di assumere che un segnale verrà abbinato con uno slot, o anche solo con una altro slot.

  

Può segnali essere utilizzati per avviare azioni? Per esempio. segnale displayInfoScreen () deve essere gestito da una fessura che mostra una schermata di informazioni.

I segnali possono essere utilizzate per avviare le azioni, ma probabilmente non nel modo in cui si sta pensando. Il segnale indica che pippo è accaduto. Se il codice di monitoraggio la classe decide che quando pippo accade, una finestra di dialogo dovrebbe essere mostrato, allora il segnale è stato utilizzato per avviare l'azione. Tuttavia, non è in genere la responsabilità della classe che emette il segnale per garantire che si verifica l'azione corretta, perché non è responsabile per fare quell'azione. (Se così fosse, allora dovrebbe essere parte della stessa classe, e sarebbe necessario alcun segnale.)

Segnali / asole (detti anche eventi) sono un buon modo per rimuovere l'accoppiamento tra gli oggetti.

Per esempio, invece di avere punti di vista che capire come funziona il modello, e quando il modello cambia, che "ascoltare" il modello. Il modello è responsabile di dire quando cambia, quello che cambia.

Il problema con gli eventi è quando si progetta i tuoi eventi con le esigenze del cliente. Ad esempio, non si dovrebbe avere un segnale displayInfoScreen perché presuppone qualcosa su oggetti utilizzando questo segnale. Al contrario, dovrebbe essere infoChanged e il InfoScreenDisplayer ascolta questi segnali per visualizzarlo sullo schermo. Se avete bisogno, si potrebbe aggiungere in seguito un InfoTweeterPoster che pubblicare le informazioni su Tweeter ogni volta che cambiano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top