2011-01-08 11 views
2

Ich habe ein paar Fragen im Vorfeld über die Verwendung von std::function über schnelle Delegaten und Möglichkeiten, wie man std::function in einer Sammlung speichern kann, um das Verhalten eines Ereignisses anzuzeigen, das hinzugefügt und entfernt werden kann. Ich fragte auch nach Best-Practice, wenn ich eine ganze Tonne kleiner Klassen schreibe, und diese kleine Design-Entscheidung wurde ebenfalls zur Beruhigung gebracht. Dies ist eine großartige Gemeinschaft!Viele Funktionen vs Viele Lambdas?

Nun, Präambel beiseite, ich muss von meiner Struktur an Ort und Stelle und es ist Zeit, alle Handler schreiben, die eingehende Daten behandeln wird. Ich habe einen std::map, das sieht wie folgt aus:

typedef std::function<void(const CommandData&)> CommandDelegate; 
typedef boost::shared_ptr<CommandDelegate> CommandDelegatePtr; 
typedef std::map<short, CommandDelegatePtr> CommandMap; 

Und ich wünsche etwa 200 Handler diese hinzuzufügen. Ich habe die Wahl zwischen Standard-Member-Funktionen und Lambdas.

Das erste, worüber ich nachgedacht habe, wenn ich über Mitgliederfunktionen nachgedacht habe, waren 200 Deklarationen und 200 Implementierungen und eine große Quelldatei.

Anstatt meine Klasse mit all diesen Handlern zu beschmutzen, dachte ich: "Nun, sie sind nur Handles, warum nicht lambdas? Es scheint einfach genug, wenn die Klasse aufgebaut ist, kann sie alle diese anonymen Funktionen der Karte zuweisen. Geschafft!

Dann erkannte ich, der Konstruktor würde sehr groß sein. ich habe ‚initializeMap` Helferfunktion nennen könnte, die möglicherweise in einer eigenen Datei aufgrund der Größe gehen könnte.

Was denkt ihr?

  1. 200 Deklarationen in der .h Datei, 200-Implementierungen (unter anderen Funktionen) in der CPP-Datei
  2. 200 Deklarationen in der .h Datei, eine separate ‚handlers.cpp` Implementierungsdatei
  3. keine Erklärungen, 200 Lambdas im Ctor zugeordnet
  4. No Deklarationen, 200 Lambdas in einer initializeMap Funktion in einer eigenen Datei zugeordnet.

Vielen Dank im Voraus!

Antwort

2

Meine Meinung ist, verwenden Sie Lambda, wo immer es möglich ist. Sie sind viel wartbarer. Wenn Sie beispielsweise eine Mitgliedsfunktion haben, müssen Sie die Deklaration und Definition jedes Mal aktualisieren, wenn Sie sie ändern. Außerdem müssen Sie ihr einen eindeutigen Namen zuweisen. Lambdas sind die überlegene Option.Wenn ich eine automatische Typableitung für Membervariablen hätte, würde ich niemals Memberfunktionen verwenden.

+0

Ich stütze mich irgendwie auf die Lambdas. Ich liebe die Idee, dass meine Hauptklasse keine kleinen Handler haben wird. Ich denke also, die Frage ist, ihnen zuzuordnen - daher die Frage nach der Klassenkonstruktor/Initialisierer-Funktion. –

+0

3 oder 4, es ist wirklich egal, obwohl meine persönliche Präferenz mehr Quelldateien als weniger ist, wie moderne Compiler gleichzeitig kompilieren können. – Puppy

+0

stimme ich ziemlich zu, wollte aber sicher gehen. Vielen Dank für Ihre Antwort. –

1

Benötigen Sie diese Funktionen wirklich, um dynamisch zu sein? Denn wenn es Ihre einzige Sorge ist, Ihre Hauptklasse nicht zu belasten, gibt es bessere (schnellere) Lösungen, wie das Erstellen einer Unterklasse oder das Aufteilen des gesamten Codes in mehrere Dateien.

Wenn Sie Ihre Kopfzeile mit den 200 Funktionen haben, aber nie ändert, wird es Ihr Projekt nicht so sehr aufblähen, weil es einfach dort liegen wird. Ein aufgeblähter Konstruktor hingegen ist schlechter, da es eine höhere Wahrscheinlichkeit gibt, dass Sie ihn irgendwann ändern müssen, und dann muss er alle diese 200 Initialisierungen neu kompilieren.

Die Kompilierzeit wird wahrscheinlich nicht so lange dauern, aber warum überhaupt stören?

Ich würde nur behalten sie Funktionen mit Deklarationen, entweder in Ihrer Hauptklasse oder in einer anderen dedizierten Klasse oder Datei, aber nicht initalisieren sie dynamisch in ctor.

+0

Nicht sicher, was Sie unter 'dynamisch' verstehen ... Daten kommen mit einem Code und der entsprechende Handler für diesen Code muss aufgerufen werden, daher die Karte mit einer 'std :: function'. Wenn Sie das nicht mit Dynamik meinen, was meinten Sie? –

+0

Ich meinte nur Lambda-Funktionen. Entschuldigung, wenn ich unklar war. – Cray