Money (Analysemuster)
# Money (Analysemuster)

Money ist ein Analysemuster von Martin Fowler und dient der Abbildung von Geldwerten in einem Computersystem. Dieses Muster ist vor allem dann einzusetzen, wenn Geldwerte in verschiedenen Währungen abgebildet werden müssen.

Money-Objekte verschiedener Währungen können in einem Money-Bag (eine Liste von Money-Objekten) zusammengefasst werden. Dies hat Vorteile wenn z. B. eine einzelne Operation (z. B. die Berechnung einer Steuer) auf mehrere Objekte gleichzeitig angewendet werden soll.

## Implementierung

Money ist ein Spezialfall des Value-Object-Musters. Der Wert stellt hierbei den Geldbetrag dar und wird als Gleitkommazahl mit hoher Genauigkeit, fester Dezimalstelle und genau definierbaren Rundungsregeln (z. B. System.Decimal in .NET oder BigDecimal in Java) dargestellt. Gleitkommazahlen nach IEEE 754 dürfen aufgrund von Rundungsfehlern nicht verwendet werden. Für Anwendungen die eine besonders hohe Genauigkeit benötigen, kann der Wert auch als rationale Zahl gespeichert und verarbeitet werden.

Abhängig von der für die Anwendung benötigten Genauigkeit kann der Wert in der Benutzerschnittstelle auf eine bestimmte Anzahl von Nachkommastellen gerundet werden. Hierbei entsteht gelegentlich der Effekt, dass die Summe aus den angezeigten gerundeten Beträgen nicht genau der intern mit hoher Genauigkeit berechneten und anschließend gerundeten Summe entspricht, was gelegentlich zu einer Verwirrung des Benutzers führt.

Weiters benötigt das Money-Objekt ein Feld zur Verwaltung der Währung des Betrages. Alternativ kann die Money-Klasse auch abstrakt implementiert werden und die einzelnen Währungen als Unterklassen implementiert werden. Das Umrechnen von einer Währung in eine andere sollte aufgrund des Separation-of-Concerns-Prinzip nicht im Money-Objekt selbst enthalten sein. Dafür anbieten würde sich das Analysemuster Conversion Ratio.

Da sich die Umtauschraten zwischen Währungen zeitlich verändern, empfiehlt sich die Verwendung eines Webservice der auch historische Werte umrechnen kann, sowie das Speichern von Währungswechseln in einer Befehlskette (d. h. eine Liste von Kommando-Objekten).

In Java wurde Money in mehreren Ausprägungen (hohe Genauigkeit vs. schnelle Rechenoperationen) inkl. historischer Umtauschraten durch den Java Specification Request 354 (Money and Currency API) definiert und durch die Referenzimplementierung Moneta umgesetzt.

Für einfache Anwendungen kann es jedoch reichen nur eine einzelne Währung zu behandeln, wodurch die Komplexität des Money-Objekts deutlich sinkt, da eine explizite Angabe und Umrechnung einer Währung entfallen kann.

