[Designfrage] "Late Execution"



  • Moin,

    ich habe eine kleine Designfrage die folgendes Szenario betrifft(und welches ich nicht genauer benennen konnte, sorry 😃 ):

    class A{
    
        void doSomething(int i){}
    
        void doSomething2(double){}
    };
    

    Und zwar würde ich gerne beim Aufruf von doSomething nicht wirklich Code ausführen lassen, sondern lediglich die Information speichern, dass doSomething, doSomething2 aufgerufen wurden. Die übergebenen Parameter sollten natürlich ebenfalls in dieser Information enthalten sein.

    Dies hat folgenden Hintergrund:
    Ich bin momentan dabei einigen Code von der darunterliegenden Implementierung zu abstrahieren/in andere Sinneinheiten zu zerlegen. Dabei würde ich die Stellen, an denen implementierungsspezifischer Code vorkommt gerne minimieren. D.h. die einzelnen Klassen der Implementierung einfach nur zu wrappen wäre doof 😉 Vielmehr hätte ich den implementierungsabhängigen Code gerne an einer Stelle, der dann nur noch eine Instanz von A enthält und die gespeicherten Methodenaufrufe entsprechend der Implementierung umsetzt.

    Ich habe auch schon einige Ansätze mit std::function/function-pointer durchprobiert, allerdings finde ich meine eigenen Ansätze meist hässlicher als diejenigen, über die sich schlauere Leute schon deutlich länger den Kopf zerbrochen haben :p

    Also wie löse ich dies am geschicktesten bzw. wonach muss ich googlen, um mir eine geschickte Lösung angucken zu können?



  • Command Pattern vielleicht?



  • Für sowas bietet sich boost::bind an und boost::function an
    Beispiel:

    class A
    {
    
        void doSomething(int i){}
    
        void doSomething2(double){}
    }; 	
    
    A a;
    std::queue<boost::function<void ()> commandQueue;
    
    //irgendwo spaeter zur spaeteren Ausfuehrung speichern:
    commandQueue.push(boost::bind(&A::doSomething, &a, 42);
    
    //noch spaeter die Funktion ausfuehren:
    commandQueue.front()(); //->a.doSomething(42);
    
    //aus der Queue schmeissen
    commandQueue.pop();
    

    PS: Wenn Dein Compiler tr1 -Unterstützung hat, dann brauchst Du nichteinmal boost. Dann gibts das freihaus.


Log in to reply