Announcement

Collapse
No announcement yet.

Log-File Vearbeitung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Log-File Vearbeitung

    Hallo zusammen,

    ich habe den folgenden Sachverhalt, und auch einen ersten Lösungsansatz, doch denke ich dass dieser womöglich nicht ganz optimal ist, habt ihr irgendwelche Tipps/Vorschläge?

    Meine Ausgangslage: Ich habe eine in C++ geschrieben DLL, die darin enthaltenen Interface-Methoden werden über eine GUI angesprochen, jeder Aufruf einer Interface-Methode wird in einem speziellen Log-File mitgeloggt (es werden in diese File nur die Funktionsaufrufe samt deren Parameterliste geschrieben). Nun soll es ermöglicht werden die einzelnen Funktionsaufrufe aus dem Log-File auszulesen und diese auszuführen.

    Gibt es hierzu nun eine andere Möglichkeit als zuerst den entsprechenden Methodennamen auszulesen und in einem großen if-else if-else Statement nach der korrekten Behandlungsroutine zu suchen? Nachteil an dieser Lösung ist, dass es zu einem sehr länglichen Konstrukt kommen würde, da die Anzahl der verschiedenen Methoden gegen 200 geht. Die einzelnen Methoden besitzen dann natürlich auch noch die unterschiedlichsten Parameterlisten. Vorteil der if-else if-else Lösung wäre mit Sicherheit deren Einfachheit.

    Nun noch mal zu meiner Frage ist es möglich den Mechanismus in irgendeiner Art und Weise dynamischer zu machen, so dass nicht ein rießiges if-else Konstrukt benötigt wird, oder gibt es beim Einsatz von C++ keine andere Möglichkeit?

    Hab schon an Reflection gedacht da ich aus der Java-Welt komme, unter C++ gibts das aber leider nicht standardmäßig, hab aber ein passendes Projekt unter http://seal-reflex.web.cern.ch/seal-reflex/ entdeckt, hat jemand von euch schon mal damit gearbeitet bzw. Erfahrung damit? Oder kennt ihr ein anderes passendes Projekt?

    Danke für eure Antworten
    Jens

  • #2
    Hallo Jens,

    hast Du Dir schon einmal überlegt, das Befehlsmuster aus dem Buch Entwurfsmuster von GVJH für Dein Problem zu verwenden. Beispielsweise könntest Du eine gemeinsame Basisklasse definieren:

    class Command
    {
    public:
    static Command* createExemplar(const CString&);

    // Liest die Parameter für den Befehl aus der übergebenen Datei
    virtual bool readParameters(CFile&) = 0;

    // Führt den Befehl aus
    virtual bool execute(void) = 0;

    protected:

    Command();

    ~ Command();
    }

    Um zum Beispiel einen Funktionsaufruf zum Löschen einer Datei zu implementieren, würdest Du jetzt eine Klasse DeleteFileCommand ableiten und die beiden Methoden readParameter und execute überschreiben. Außerdem müsstest Du jetzt noch einen Eintrag in der createExemplar zufügen:

    Command* Command ::createExemplar(const CString& strName)
    {
    Command* pCommand = 0;

    if ( strName == “DeleteFileCommand” )
    pCommand = new DeleteFileCommand();

    ASSERT( pCommand != 0);
    return pCommand;
    }

    Im Hauptprogramm würde dann etwa folgender Code zugefügt werden und anschließend müsste hier nichts mehr geändert werden:


    Command* pCommand = Command::createExemplar(strName);
    if( pCommand-> readParameters( fFile ) )
    pCommand->execute( );


    Im ungünstigsten Fall hättest Du natürlich auch noch noch 200 verschiedene Klassen und eine sehr lange createExemplar-Methode. Aber vielleicht könntest Du dann einige Befehlsklassen in gemeinsamen Basisklassen (z.B. FileCommand) zusammenfassen.

    Ich hoffe, ich habe das Problem richtig verstanden und die Antwort hilft.

    Viele Grüße
    Kai Siegele

    Comment

    Working...
    X