Question

Nous utilisons Qt qui offre des signaux et slots que je trouve vraiment pratique. Cependant, avec une grande puissance vient une grande responsabilité et je pense qu'il est très facile aussi une mauvaise utilisation de cette fonction.

Y a-t-il des meilleures pratiques pour l'utilisation signal-slot? Je vais avoir du mal à trouver quelques directives générales de cette manière. Quelques questions (j'ai des opinions claires sur, mais que tous les membres de mon équipe sont d'accord avec):

  • Est-il autorisé à utiliser des signaux pour signaler des erreurs?
  • Est-il autorisé à supposer qu'un signal sera traité?
  • Les signaux peuvent être utilisés pour lancer des actions? Par exemple. signal displayInfoScreen() doit être assurée par une fente qui montre un écran d'information.

Les autres avis sur le moment où les signaux doivent / ne doivent pas être utilisés sont très Bienvenue!

Était-ce utile?

La solution

  

est-il autorisé à utiliser des signaux pour signaler
  erreurs?

Oui, par exemple, voir QFtp, où le signal fait porte un statut. Il ne porte pas l'erreur réelle, l'information juste qu'une erreur est survenue.

  

Est-il correct de supposer qu'un signal   être traitées?

Non. L'expéditeur ne peut jamais supposer que, cependant, votre application peut dépendre. Par exemple, le représentant QAction Fichier - De nouveaux besoins à traiter pour l'application au travail, mais l'objet QAction ne pouvait pas moins de soins

.
  

Les signaux peuvent être utilisés pour initier   Actions? Par exemple. signal   displayInfoScreen () doit être manipulé par   une fente qui montre un écran d'information.

Encore une fois, oui, par exemple l'objet QAction. Mais si vous voulez être en mesure de réutiliser les composants, vous devez faire attention à faire en sorte que la classe réelle ne dépend pas d'elle.

Autres conseils

Les signaux et slots sont puissants découple parce que les objets. Vous ne pouvez pas supposer qu'un signal a une fente reliée, comme précédemment répondu.

Un inconvénient majeur de la conception fondée sur le signal / slot est que vous pouvez très facile piste lâche de la logique vous mis en œuvre , car une action d'un objet peut déclencher d'autres actions de tout autre objet relié à un signal émis. Il est beaucoup plus facile d'avoir des effets secondaires indésirables, les appels récursifs, etc.

  

Est-il correct de supposer qu'un signal sera traité?

Non, ce n'est pas. Les signaux sont le feu et oublier le type de choses. Qui se connecte à un signal et ce qu'il ne devrait pas être la préoccupation de l'émetteur.

  

Est-il correct d'utiliser des signaux pour signaler les erreurs?

Oui, mais je généralement que cette situation dépendante. Si l'erreur peut se produire de manière asynchrone, alors un signal pour indiquer tel est certainement bon. Si l'erreur se produit uniquement lorsque le code client appelle une certaine fonction, l'erreur devrait être dans la réponse de cette fonction, et non comme un signal. Cependant, il y a un large éventail de situations entre cela pourrait se faire au cas par cas.

En outre, les mécanismes de signal sous peuvent faire la communication inter-threads plus facile (qui pourrait bien être considéré comme le cas asynchrone), et je les utiliser à cette fin (erreur ou non).

  

Est-il correct de supposer qu'un signal sera traité?

Les signaux sont (philosophiquement) conçu pour indiquer que quelque chose est arrivé. Comme d'autres l'ont indiqué, il est jamais une bonne idée de supposer qu'un signal sera jumelé à une fente, ou même avec seulement un autre fente.

  

Les signaux peuvent être utilisés pour lancer des actions? Par exemple. le signal displayInfoScreen () doit être manipulé par une fente qui montre un écran d'information.

Les signaux peuvent être utilisés pour lancer des actions, mais probablement pas de la manière que vous pensez. Le signal indique que foo est arrivé. Si le code de suivi de votre classe décide que lorsque foo se produit, une boîte de dialogue doit être affiché, le signal a été utilisé pour initier cette action. Cependant, il est généralement pas la responsabilité de la classe émission du signal pour faire en sorte que l'action appropriée se produit, car il n'est pas responsable de faire cette action. (Si elle était, alors il devrait faire partie de la même classe, et aucun signal ne serait nécessaire.)

signaux / slots (également appelés événements) sont une bonne façon d'enlever le couplage entre les objets.

Par exemple, au lieu d'avoir des vues qui comprennent comment le modèle fonctionne, et quand le modèle change, ils « écoutent » au modèle. Le modèle est responsable de dire quand il change, ce qui change.

Le problème des événements est lorsque vous concevez vos événements avec les exigences du client. Par exemple, vous ne devriez pas avoir un displayInfoScreen signal car il suppose quelque chose sur des objets en utilisant ce signal. Au lieu de cela, il devrait être infoChanged et InfoScreenDisplayer écoute ce signal pour l'afficher à l'écran. Si vous avez besoin, vous pouvez ajouter plus tard InfoTweeterPoster ce poste les informations sur Tweeter chaque fois qu'ils changent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top