Wie kann ich eine lazy-evaluated Stateful-Klasse mit internen Abhängigkeiten in Java implementieren?

8

Ich schreibe eine finanzielle Berechnungsklasse, die eine Reihe von Setterfunktionseingaben, einige private Zwischenwerte und eine Anzahl von Getterfunktionen als Ausgaben haben wird.

  • Die privaten Zwischenwerte sind nur von den Eingabewerten abhängig.

  • Die Ausgabewerte (auf die von öffentlichen Gettern zugegriffen wird) sind nur von den Eingaben und den Zwischenwerten abhängig.

Letztendlich könnte man das Ganze als etwas verschlungenen azyklischen gerichteten Graphen mit einer Reihe von Eingängen auf einer Seite zeichnen, die schließlich zu einer Reihe von Ausgängen auf der rechten Seite fließen.

Was ist der beste Weg, um diese Klasse zu implementieren? Ich habe einige spezifische Anforderungen:

  • Wo möglich, faul bewerten. Wenn sich eine Eingabe ändert, wissen wir jetzt, welche Ausgaben benötigt werden.

  • Die Klasse muss leicht neu zu gestalten sein, so dass eine Art deklaratives Modell bevorzugt würde.

Idealerweise würde ich gern sagen können, dass C von A und B abhängt. Wenn C angefordert würde, nachdem entweder A oder B sich geändert hatten, würde es wissen, dass C neu berechnet werden musste, sonst würde C niemals brauchen erfrischt werden.

Gibt es dort ein Java-Muster, das mir helfen könnte, diese Art von Rechner sauber zu implementieren?

    
Salim Fadhley 10.02.2012, 12:19
quelle

4 Antworten

2

Sie können eine Lösung erstellen, indem Sie einen zukünftigen Wert erstellen, der neu berechnet werden kann.

%Vor%

Es ist völlig faul und ermittelt die Abhängigkeiten.

    
Kru 10.02.2012, 22:44
quelle
2

Sie können ein Muster wie dieses verwenden.

%Vor%     
Peter Lawrey 10.02.2012 13:16
quelle
2

Scheint so, als ob Sie ein Echtzeit-Stream-Verarbeitungsproblem haben.

Schau dir Twitter an storm . Selbst wenn Sie sich entschließen, es nicht zu verwenden, können Sie einige Konzepte ausleihen, die auf der Lernprogramm-Seite erläutert werden.

    
Mairbek Khadikov 10.02.2012 17:01
quelle
1

Persönlich stimme ich Peter zu, aber um Argumente willen habe ich zwei andere Antworten. Ich würde empfehlen, eine Regel-Engine (z.B. Drools) zu betrachten, um eine flexible Geschäftslogik wie diese zu implementieren. Sie sind so konzipiert, dass die Regeln für Updates zwischen Variablen einfach zu ändern sind. Sie sollten auch ziemlich performant sein.

Dann, für den DYI-er, hier ist eine Frühlings-inspirierte Version. Der größte Nachteil ist, dass Sie Ihre Abhängigkeiten als Liste erhalten. Sie könnten leicht eine HashMap verwenden, aber dann verlieren Sie Ihre Syntax-Sicherheit.

%Vor%

Die entsprechende applicationContext.xml würde wie folgt aussehen:

%Vor%

Für zusätzliche Kredite könnten Sie einen Bean-Post-Prozessor implementieren, um die Abhängigkeiten basierend auf Annotationen automatisch zu berechnen und festzulegen. Zum Beispiel:

%Vor%     
Pace 10.02.2012 15:46
quelle

Tags und Links