Viele Vor/Nachaufrufe via std::function
-
Hi,
ich habe jetzt nochmal lang und breit über mein Design nachgedacht und bin kurz davor es wieder wegzuwerfen. Ich muss jetzt nochmal abstrakt nachfragen:
Habt ihr es oft, dass ihr einer Klasse mehrere std::function-Vektoren gebt, wenn ihr gewisse Pre/Postconditions oder Filter dort einfügen wollt?
Wahrscheinlich braucht es wieder mehr Details, aber es ist dasselbe Problem wie vorhin. Es gibt ein hier nicht näher definiertes Objekt, was eine Insert-Methode anbietet. Es soll aber nur nach einem Filter eingefügt werden. Und nach dem Insert soll noch eine Funktion aufgerufen werden können von außen. Das sähe mit std::function gelöst so aus:
class SomeContainerLikeClass { typedef /* ... */ ElementType; typedef std::function<ElementType (ElementType)> FilterFunction; typedef std::function<void (ElementType)> AfterInsertFunction; typedef std::vector<AfterInsertFunction> AfterInsertFunctions; typedef std::vector<FilterFunction> FilterFunctions; FilterFunctions filterFunctions; AfterInsertFunctions afterInsertFunctions; public: void AddFilterFunction(FilterFunction foo) {filterFunctions.push_back(foo);} void AddAfterInsertFunction(AfterInsertFunction foo) {afterInsertFunctions.push_back(foo);} void Insert(ElementType element) { ElementType insertElement(element); for(const auto& foo, filterFunctions) insertElement = foo(insertElement); // füge tatsächlich ein for(const auto& foo, afterInsertFunctions) foo(insertElement); } }; // sorry bei Fehlern, ist so runtergeschriebenGut, ich sehe, dass man darüber extrem flexibel und ohne jegliche Abhängigkeiten eine SomeContainerLikeClass strukturieren kann. Zudem brauche ich weder Polymorphie noch muss ich etwas templatisieren. Und mehrere Klassen brauche ich schon gar nicht.
Sagen wir, ich habe noch 2-3 weitere std::function-Objekte. Wäre die Anzahl von std::function-Objekten eurer Meinung nach ein Hindernis zum Einsatz? (mir ist bewusst: für potentiell bessere Wege oder eine Aussage der Form "das ist DIE beste Lösung" muss ich wohl mehr Infos rezitieren; aber mir geht's jetzt nur darum, ob es ein Hindernis darstellt, sodass ich dann selbst weiter abwägen kann)
Ich hoffe, die Abstraktheit der Frage hält euch nicht davon ab eure Gedanken zu dieser auszudrücken.
Vielen Dank und beste Grüße!
-
Ich wuerde den den Container fuer Filter abstrahieren oder ganz wegzulassen. D.h. aus mehreren Filtern einen neuen Filter konstruieren. Konkret benoetigst du Operationen wie AND-, OR- und NOT-Funktionale ums aus 1-2 Filternfunktionen eine neue zu konstruieren.
-
Achso, weil meine aktuelle Version alle Filter verundet?
Meinst Du damit, dass ich keinen vector von Filtern sondern nur einen optionalen Filter anbieten sollte? Und der Aufrufer bastelt sich dann einen Filter, der alles, was er haben möchte, kombiniert?
-
Eisflamme schrieb:
Meinst Du damit, dass ich keinen vector von Filtern sondern nur einen optionalen Filter anbieten sollte?
Wieso optional? Dafür gibts den Nullfilter.
Der Filterverunderer kann aus Performancegründen auch über einen Vektor implementiert sein, aber für die Klasse spielt das keine Rolle, die kennt nur einen einzigen Filter also eine std::funcion.
-
-
Gut, das meinte ich. Danke
