Frage

an einem Projekt arbeiten, das ein Protokoll der Ereignisse analysiert und aktualisiert dann ein Modell auf Eigenschaften dieser Ereignisse. Ich habe ziemlich faul über „getting es getan“ und mehr besorgt über Upfront-Optimierung, schlanken Code und die richtige Design-Muster. Meistens ist ein selbstlern Experiment. Ich bin daran interessiert, was Muster erfahrene Designer denken relevant sind, oder welche Art von pseudocoded Objektarchitektur der beste wäre, am einfachsten zu halten und so weiter.

Es kann 500.000 Ereignisse in einem einzigen Protokoll sein, und es gibt etwa 60 Arten von Veranstaltungen, von denen alle gemeinsam nutzen etwa 7 Basiseigenschaften und haben dann 0-15 zusätzliche Eigenschaften je nach Ereignistyp. Die Art der Veranstaltung ist die zweite Eigenschaft in der Log-Datei in jeder Zeile.

So denn ich habe ein wirklich hässlich Imperativ Parser versucht, die durch eine Linie durch die Protokollzeile geht und dann verarbeitet Ereignisse Zeile für Zeile. Dann habe ich versucht, eine lexikalische Spezifikation, die ein „Nextevent“ Muster verwendet, die in einer Schleife und verarbeitet genannt wird. Dann habe ich versucht, eine einfache alte „Parse“ Methode, die nie zurückkehrt und gerade löst Ereignisse für registrierte Hörer Rückrufe. Ich habe versucht, sowohl einen einzelnen Rückruf unabhängig von Ereignistyp, und eine Callback-Methode spezifisch für jeden Ereignistyp.

Ich habe eine Basis „Ereignis“ Klasse mit einer Vereinigung aller möglichen Eigenschaften versucht. Ich habe versucht, den „neues Ereignis“ Aufruf zu vermeiden (da es eine große Anzahl von Ereignissen sein kann und die Ereignisobjekte im Allgemeinen kurzlebig sind) und pro Art mit primitiver Eigenschaft Argumenten die Rückrufmethoden haben. Ich habe versucht, eine Unterklasse für jede der 60 Ereignistypen mit einem abstrakten Ereignisse Elternteil mit den 7 gemeinsamen Grundeigenschaften.

Ich versuchte vor kurzem, dass eine weitere Einnahme und ein Befehlsmuster unter Verwendung von Ereignis setzen pro Ereignistyp Behandlungscode. Ich bin nicht sicher, Ich mag diese und es ist wirklich ähnlich wie die Rückrufe pro Typ Ansatz ist nur Code innerhalb einer Ausführungsfunktion in den Typunterklassen im Vergleich zu den Callback-Methoden pro Typ.

Das Problem ist, dass eine Menge des Modellaktualisierungslogik gemeinsam genutzt wird, und eine Menge davon ist spezifisch für die Unterklasse, und ich beginne nur verwirrt über die ganze Sache zu bekommen. Ich hoffe, jemand kann mir zumindest zeigen in eine Richtung zu betrachten!

War es hilfreich?

Lösung

Nun ... für eine Sache und nicht ein einzelnes Ereignis-Klasse mit einer Vereinigung aller Eigenschaften oder 61 Ereignisklassen (1 Base, 60 subs), in einem Szenario mit so viel Variation, würde ich zu verführen habe eine einzelne Ereignis-Klasse, die eine Eigenschaft Beutel verwendet (Wörterbuch, Hash-Tabelle, w / e Ihr Boot schwimmt) Ereignisinformationen zu speichern. Die Art der Veranstaltung ist nur eine weitere Eigenschaft Wert, der in den Beutel gelegt wird. Der Hauptgrund, warum ich so lehnen würde, ist nur, weil ich verabscheuen würde 60 abgeleiteten Klassen nichts zu halten.

Die große Frage ist ... was tun Sie müssen tun mit den Ereignissen, wie Sie sie verarbeiten. Haben Sie sie in einen Bericht zu formatieren, organisieren sie in eine Datenbanktabelle, wache Menschen, wenn bestimmte Ereignisse auftreten ... was?

Ist das einen After-the-fact-Parser oder einen Echtzeit-Event-Handler sein soll? Ich meine, überwachen Sie das Protokoll als Ereignisse in kommen, oder einfach nur das Parsen Protokolldateien am nächsten Tag?

Andere Tipps

eine Flyweight Fabrik Strategie Objekte Betrachten wir eine pro ‚Klasse‘ des Ereignisses.

Für jede Zeile von Ereignisdaten, suchen die entsprechende Parsing-Strategie aus der Fliegengewicht Fabrik, und dann die Ereignisdaten an die Strategie übergibt für die Analyse. Jede der 60 Strategie Objekte könnten der gleichen Klasse sein, aber mit einer anderen Kombination von Feld Parsing Objekte konfiguriert. Es ist ein bisschen schwierig, um genauer zu sein, ohne weitere Details.

Hash-Adapter Objekte (wenn Sie können finden eine gute Erklärung davon im Web -. sie scheinen zu fehlen)

Direkt an der Spitze:

Ich mag den Vorschlag in der akzeptierten Antwort über nur eine Klasse mit einer Karte von Eigenschaften. Ich denke auch, das behvavior kann auch auf diese Weise zusammengebaut werden:

class Event
{
    // maps property name to property value
    private Map<String, String> properties;

    // maps property name to model updater
    private Map<String, ModelUpdater> updaters; 

    public void update(Model modelToUpdate)
    {
        foreach(String key in this.properties.keys)
        {
            ModelUpdater updater = this.updaters[key];
            String propertyValue = this.properties[key];

            updaters.updateModelUsingValue(model, propertyValue);
        }
    }

}

Die ModelUpdater Klasse wird nicht dargestellt. Es aktualisiert das Modell auf einer Immobilie. Ich habe die Schleife nach oben; Dies kann oder kann nicht sein, was Ihr Algorithmus tatsächlich ist. Ich würde wahrscheinlich ModelUpdater mehr eine Schnittstelle machen. Jeder Implementierer pro Objekt und würde das Modell aktualisieren.

Dann ist mein "Hauptschleife" wäre:

Model someModel;

foreach(line in logFile)
{
    Event e = EventFactory.createFrom(line);
    e.update(someModel);
}

EventFactory baut die Ereignisse aus der Datei. Es füllt die zwei Karten auf den Eigenschaften des Ereignisses basieren. Dies bedeutet, dass es irgendeine Art von Art und Weise ist eine Eigenschaft mit dem zugehörigen Modell Updater entsprechen.

Ich habe keinen Fantasie-Muster-Namen für Sie. Wenn Sie einige komplexe Regeln haben wie wenn ein Ereignis Eigenschaften A, B und C, dann das Modell Updater für B ignorieren, dann hat dieser Ansatz irgendwie erweitert werden. Wahrscheinlich müssen Sie einige Regeln in die EventFactory irgendwie Muster unter Verwendung der Regel Objekt injizieren. Dort gehen Sie, es ist ein Mustername für Sie!

Ich bin mir nicht sicher, ob ich das Problem richtig zu verstehen. Ich nehme an, es ist eine komplexe ‚Modellaktualisierung Logik‘. verteilt diese nicht mehr als 60 Klassen durch, halten Sie es an einem Ort, bewegen sie von den Ereignisklassen (Vermittler-Muster, eine Art) aus.

Ihr Mediator wird mit Ereignisklassen arbeiten (ich sehe nicht, wie Sie die Flyweight hier nutzen könnten), werden die Ereignisse selbst analysieren kann.

Wenn die Update-Regeln sehr kompliziert sind Sie nicht wirklich das Problem mit einer Allzweck-Programmiersprache bewältigen können. Betrachten wir eine regelbasierte Engine oder etwas Ähnliches verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top