7
votes

Signal / Slot vs. Appels de fonction directe

J'ai donc commencé à apprendre à apprendre qt 4.5 et à trouver le mécanisme de signal / machine à sous d'aide. Cependant, maintenant je me trouve à envisager deux types d'architecture.

Ceci est celui que j'utiliserais xxx

Remarque: Code inline pour une brièveté.

maintenant avec des signaux que je pouvais < PRE> XXX

Ceci est plus propre, réduit la nécessité d'une interface, mais dois-je le faire juste parce que je pouvais? Le premier bloc de code nécessite plus de dactylographie et de plusieurs classes, mais cela montre une relation. Avec le deuxième bloc de code, tout est plus "sans forme". Lequel est plus souhaitable et s'il est au cas par cas, quelles sont les directives?


0 commentaires

3 Réponses :


3
votes

Il y a une autre différence. # 1 est un câblé dur à l'interface IDatablock et la classe de mise à jour doit savoir sur "quelqueblock". # 2 Peut être couplé en retard via un appel de connexion (ou plusieurs, y compris des déconnexes), ce qui conduit à une approche plus dynamique. # 2 agit comme un message (pensez que SmallTalk / Objc) et non un appel (pensez C / C ++). Les messages peuvent également être soumis à plusieurs envois, ce qui nécessite la mise en œuvre de la main de la main dans la n ° 1.

Ma préférence serait d'utiliser des signaux / machines à sous due à leur flexibilité, à moins que la performance de code ou la nécessité de données de retour immédiat ne le permettent pas (ou la dépendance à la demande QT n'est pas souhaitable).


0 commentaires

10
votes

Emmitting Un signal coûte peu de commutateurs et quelques appels de fonction supplémentaires (en fonction de quoi et comment est connecté), mais les frais généraux doivent être minimes.

Le fournisseur d'un signal n'a aucun contrôle sur qui ses clients sont et même s'ils ont tous réellement obtenu le signal à l'époque des retours émetteurs.

Ceci est très pratique et permet un découplage complet, mais peut également entraîner des problèmes lorsque l'ordre d'exécution est important ou lorsque vous souhaitez renvoyer quelque chose.

Ne laissez jamais passer les pointeurs à des données temporaires (sauf si vous savez exactement ce que vous faites et même alors ...). Si vous devez, transmettre l'adresse de votre variable de membre - QT fournit un moyen de retarder la destruction de l'objet jusqu'à ce que tous les événements soient traités.

Les signaux peuvent également requrer la boucle d'événement pour être en cours d'exécution (sauf si la connexion est directe, je pense).

Globalement, ils ont beaucoup de sens dans les applications entraînées (en fait, il devient rapidement très gênant sans eux).

Si vous utilisez déjà QT dans un projet, utilisez-les certainement. Si la dépendance sur QT est inacceptable, Boost a un mécanisme similaire.


0 commentaires

2
votes

Les deux formes peuvent sembler similaires. Fonctionnellement, c'est vrai. En pratique, vous résolvez un problème plus important. Dans ces cas, des circonstances extérieures entraîneront ces deux solutions ne pas être équivalentes.

Un cas commun consiste à déterminer la relation entre source et évier. Se connaissent-ils même? Dans votre premier exemple, UpdateDateata () doit avoir l'évier est passé. Mais que si la gâchette est une touche d'interface graphique [Mettre à jour les données]? Les poussoirs sont des composants génériques et ne devraient pas savoir sur IDatablock.

Une solution est bien sûr d'ajouter un membre M_SOMEBLOCK à la mise à jour. Le bouton-poussoir mettrait désormais à jour le membre de la mise à jour. Mais est-ce vraiment ce que vous vouliez?


0 commentaires