2010-12-01 1 views
1

Gibt es einen Nachteil (Leistung/Wartung usw.), wenn alle Einstellfunktionen als SLOTS in Qt verwendet werden?Nennen Sie den Nachteil (Leistung/Wartung usw.), alle Setter-Funktionen als SLOTS in Qt zu haben?

Einige der Nachteile i sehen sind,

1) Unnötige Aufruf von MOC und Unnötige moc-Dateien während der Kompilierung 2) Bruch in der Ausnahmebehandlung Kette erstellt, da Ausnahmen in Signal-Slot-Verbindung nicht übergeben werden 3) Unnötige Komplexität beim Debugging, da es schwieriger ist, mit dem Signal-Slot zu debuggen, als bei einem direkten Methodenaufruf.

Können Sie weitere Nachteile (falls vorhanden) auflisten?

+5

Nur weil Sie einen Setter einen Steckplatz machen bedeutet nicht, dass der direkte Aufruf woanders durch emit/connect gehen würde - es wird immer noch ein gewöhnlicher Funktionsaufruf sein. Ebenso Ausnahmen - wenn Sie innerhalb eines Setter werfen, wird die Ausnahme ausgelöst, wo auch immer diese aufgerufen wird. Wenn es als ein Schlitz bezeichnet wird, ist dies der Ort, an dem das mit ihm verbundene Signal ausgesendet wird. Sonst wäre es genau da, wo Sie den Funktionsaufruf haben. Sie sind sicher, dass Sie verstanden haben, wie Signale/Slots in Qt implementiert werden? –

Antwort

4

Wenn Sie die Setter direkt aufrufen, können Sie die meisten der genannten Nachteile vermeiden. Es verhält sich wie jeder andere normale Anruf. Der einzige Nachteil in diesem Fall wäre die längere Compiler-Zeit und die größere Größe der Bins.

Wenn Sie alle Ihre Setter aufrufen, indem Signale aussendet, dann:

1) Komplexere Code; da du dich daran erinnern musst, all deine Signale mit all deinen Slots für jeden Satz zu verbinden.

2) Kleiner Leistungshit. Es wäre für jede GUI-App zu vernachlässigen; aber es ist da.

3) Weniger deterministischer Code. I.e. Abhängig davon, wie die Signale verbunden sind, kann der Anruf direkt an den Angerufenen weitergeleitet oder über ein Ereignissystem gesendet werden. Dies erschwert das Debuggen zusätzlich zu dem, was Sie bereits erwähnt haben.

4) IDE-Probleme. Wenn Sie QtCreator oder KDevelop nicht verwenden, kann die IDE die speziellen Schlüsselwörter (Slot, Signal, Emit) nicht verstehen.

Mit Ausnahme (1), all diese Probleme sind gering. Aber der Hauptgrund dafür, dies nicht zu tun, würde ich sagen, wäre es nicht sinnvoll. Warum, wenn Sie nicht brauchen?

Beim Software-Engineering sollte es darum gehen, Komplexität zu managen, sie nicht zu erzeugen.

+1

Gute Möglichkeit, es zu sagen. Ein Setter ist nur eine Funktion, und während Sie es für Qt's Meta-Objekt-System sichtbar machen können, bedeutet das nicht, dass Sie diese Funktion nur über das Signal/Slot von Qt aufrufen können. In der Tat, wenn Sie es direkt anrufen können und Sie wissen, dass Sie es anrufen möchten, warum verwenden Sie den harten Weg. –

+0

@FrankH Nun, es gibt immer noch gute Gründe, Signal/Slots zu verwenden. Wie zB 1 Signal für N-Slots, threadsichere Aufrufe usw. Der Punkt ist, dass Signale/Slots aus bestimmten Gründen da sind; und einfache Funktionsaufrufe nicht vollständig zu ersetzen, die die Setter die meiste Zeit sind. – Gianni

Verwandte Themen