Frage

Wir verwenden Qt, dass Angebote Signale und Slots, die ich finden wirklich bequem. Doch mit großer Macht kommt große Verantwortung, und ich denke, es ist sehr einfach zu dieser Funktion zu missbrauchen.

Gibt es Best Practices für Signal-Slot-Nutzung? Ich habe eine harte Zeit, ein paar allgemeine Richtlinien auf diese Weise zu finden. Einige Fragen (Ich habe klare Meinungen über, aber, dass nicht alle Mitglieder des Teams stimmen):

  • Ist es ok, Signale zu melden Fehler zu benutzen?
  • Ist es in Ordnung, anzunehmen, dass ein Signal behandelt werden?
  • Can-Signale verwendet werden, um Aktionen zu initiieren? Z.B. signal displayInfoScreen() muss durch einen Schlitz, dass zeigt ein Info-Bildschirm behandelt werden.

Jede andere Meinungen zu, wenn Signale sollte / sollten nicht verwendet werden, sind sehr Willkommen!

War es hilfreich?

Lösung

  

Ist es ok, Signale zu verwenden, zu berichten
  Fehler?

Ja, zum Beispiel, siehe QFtp, wo das Signal DONE einen Status trägt. Es führt keine die tatsächlichen Fehler, nur Informationen, dass ein Fehler aufgetreten ist.

  

Ist es in Ordnung, anzunehmen, dass ein Signal   gehandhabt werden?

Nein. Der Absender kann nie davon ausgehen, dass jedoch Ihre Anwendung auf sie verlassen kann. Zum Beispiel der QAction Datei darstellt - muss neu für die Anwendung unsachgemäß behandelt werden, aber das QAction Objekt wurscht

.
  

Can-Signale verwendet werden, um zu initiieren   Aktionen? Z.B. Signal   displayInfoScreen () muss durch gehandhabt werden   ein Schlitz, der zeigt einen Info-Bildschirm.

Auch hier ja zum Beispiel des QAction Objekt. Aber wenn Sie Wiederverwendung Komponenten in der Lage sein wollen, müssen Sie vorsichtig sein, um sicherzustellen, dass die tatsächliche Klasse nicht auf sie abhängig ist.

Andere Tipps

Signale und Slots sind mächtig, weil entkoppelt Objekte. Sie können nicht davon ausgehen, dass ein Signal, ein Schlitz verbunden ist, wie bereits beantwortet.

Ein großer Nachteil Signal / Slot-basierte Design ist, dass man sehr leicht den Überblick verlieren die Logik, die Sie umgesetzt , da eine Aktion eines Objekts können andere Aktionen eines anderen Objekts auslösen, dass mit ein Signal ausgesendet. Es ist viel einfacher zu unerwünschten Nebenwirkungen zu haben, rekursive Aufrufe, etc.

  

Ist es in Ordnung, anzunehmen, dass ein Signal behandelt werden?

Nein, es ist nicht. Die Signale sind fire-and-forget Art von Dingen. Wer eine Verbindung zu einem Signal und was es tut sollte die Emitter Sorge nicht sein.

  

Ist es ok, Signale zu melden Fehler zu benutzen?

Ja, aber ich würde diese situationsabhängig im Allgemeinen machen. Wenn der Fehler asynchron auftreten könnte, dann ein Signal anzeigen, so auf jeden Fall die richtige ist. Wenn nur der Fehler tritt auf, wenn Client-Code eine bestimmte Funktion aufruft, dann sollte der Fehler von dieser Funktion in der Antwort, nicht als ein Signal. Allerdings gibt es eine breite Palette von Situationen, in zwischen das könnte auf einer Fall-zu-Fall-Basis durchgeführt werden.

Auch Signal-Slot-Mechanismen können Cross-Thread-Kommunikation zu erleichtern (die auch den asynchronen Fall in Betracht gezogen werden könnte), und ich werde sie zu diesem Zweck (Fehler oder nicht) verwendet werden.

  

Ist es in Ordnung, anzunehmen, dass ein Signal behandelt werden?

Die Signale werden (philosophisch) entworfen, dass etwas, um anzuzeigen, ist passiert. Wie andere schon angedeutet haben, ist es nie eine gute Idee zu der Annahme, dass ein Signal mit einem Schlitz angepasst werden, oder sogar mit nur einem anderem Steckplatz.

  

Can-Signale verwendet werden, um Aktionen zu initiieren? Z.B. Signal displayInfoScreen () muss durch einen Schlitz behandelt werden, dass zeigt ein Info-Bildschirm.

können Signale verwendet werden, um Aktionen zu initiieren, aber wahrscheinlich nicht in der Art und Weise sind Sie denken. Das Signal zeigt an, dass foo passiert ist. Wenn der Code Klasse Überwachung entscheidet, dass, wenn foo geschieht, soll ein Dialogfeld angezeigt, dann wurde das Signal verwendet, um diese Aktion zu initiieren. Allerdings ist es im Allgemeinen nicht in der Verantwortung der Klasse das Signal emittiert, um sicherzustellen, dass die richtige Handlung vorgenommen wird, weil es dafür, dass die Aktion nicht verantwortlich ist. (Wenn ja, dann sollte es Teil der gleichen Klasse sein, und kein Signal erforderlich wäre.)

Signale / Slots (auch genannt Ereignisse) sind eine gute Möglichkeit, Kopplung zwischen Objekten zu entfernen.

Zum Beispiel, anstatt Ansichten zu haben, die wie das Modell funktioniert verstehen, und wenn sich das Modell ändert, sie „hören“ auf das Modell. Das Modell ist verantwortlich zu sagen, wenn sie sich ändert, was sich ändert.

Das Problem mit Ereignissen ist, wenn Sie Ihre Veranstaltungen mit Client-Anforderungen entwerfen. Zum Beispiel sollten Sie kein Signal displayInfoScreen haben, weil es etwas über Objekte Verwendung dieses Signals annimmt. Stattdessen sollte es infoChanged und die InfoScreenDisplayer Streams zu diesen Signalen werden sie auf dem Bildschirm angezeigt werden soll. Wenn Sie brauchen, können Sie später hinzufügen eine InfoTweeterPoster, die die Informationen über Tweeter veröffentlichen, wenn sie sich ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top