Quantität (Analysemuster)

aus Wikipedia, der freien Enzyklopädie

Quantität (englisch Quantity) ist ein Analysemuster aus der Softwaretechnik und dient zur Modellierung messbarer Werte und ihrer Einheit. Das Muster wurde von Martin Fowler entwickelt und in seinem Buch Analysemuster beschrieben.

Problem

Computersysteme verarbeiten die Informationen über Objekte der realen Welt als Attribute von softwaretechnischen Objekten. Messbare Werte werden dabei als Zahl ohne Einheit dargestellt, da gängige Programmiersprachen keine Datentypen für SI-Größen oder Währungen anbieten.

In der Praxis führt dieser Sachverhalt immer wieder zu Fehlern in Anwendungsprogrammen, wenn Berechnungen zwischen verschiedenen Einheiten nicht korrekt durchgeführt oder nicht verhindert werden, wie bei der Addition von 5 Metern und 10 Gramm.

Kontext

Quantität gehört zur Gruppe der Analysemuster Wahrnehmungen und Messungen (englisch Observations and Measurements). In dieser Gruppe finden sich Analysemuster, die im Rahmen eines Projekts zur Entwicklung einer medizinischen Anwendung im klinischen Bereich entstanden sind. Die Muster haben allgemeinen Anspruch und können leicht auf andere Anwendungsdomänen übertragen werden.

Andere wichtige Muster dieser Gruppe sind Umwandlungsverhältnis, zusammengesetzte Einheit, Messung, und Wahrnehmung. Umwandlungsverhältnis erweitert Quantität und erlaubt die Umrechnung von einer Einheit in eine andere.

Der technische Einsatz dieses Analysemusters ist natürlich aufgrund der Vorgabe der Messbarkeit (zahlenmäßige Erfassung) bestimmter Merkmale dem Gebiet der Naturwissenschaften vorbehalten. Zum Zwecke der Standardisierung wurde hierfür ein sogenanntes „Internationales Einheitensystem“ entwickelt, das die Basisgrößen sowie ihre zugehörigen Basiseinheiten und zugeordnete Kurzzeichen nach internationalem Standard beinhaltet.

Lösung

Datei:Quantity analysemuster uml-darstellung.png
Muster Quantität als Klassendiagramm

Der Begriff „Quantity“ ist mit dem deutschen Wort „Menge“ gleichgestellt. Er beschreibt die zahlenmäßige Erfassung von bestimmten Dingen in unserer realen Welt (Abzählbarkeit von Objekten). Darunter versteht man einen abgegrenzten messbaren Raum von Objekten eines bestimmten Typs. Dieser Raum wird durch den Namen des Typs dargestellt und durch die Objekte in abzählbare Einheiten gleicher Größe eingeteilt. Diesen Einheiten weist man zur Darstellung der Unterscheidung eindeutige Namen zu. Zur Beschreibung der Menge wird der Einheit ein Zahlenwert vorangestellt. Die sich daraus ergebenden Messwerte setzen sich daher immer aus einem Betrag und einer dazugehörigen Einheit zusammen.

Bestimmte Datentypen werden vom Typen-System der Programmiersprache über den Compiler zur Verfügung gestellt. Solche Datentypen sind beispielsweise Integer, Real, String und Datum. Da der Compiler diese Datentypen bereits versteht, können diese bereits für die Implementierung von Attributen innerhalb einer Klasse verwendet werden. Andere Datentypen wiederum kennt der Compiler nicht oder sie setzen sich aus mehreren Grundattributen zusammen. Diese Typen implementiert man als abstrakte Datentypen in neuen Klassen und stellt dann über Beziehungen entsprechende Verbindungen zu den Klassen her, die auf diese Datentypen zugreifen müssen.

Quantität modelliert messbare Werte als Typ, der den Betrag mit seiner zugehörigen Einheit kombiniert. Quantität kann so zur Darstellung aller messbaren Werte verwendet werden und eignet sich besonders für Währungen.

Werden messbare Werte und deren Einheit auf diese Weise als Objekte modelliert, ergeben sich daraus eine Reihe von Vorteilen. So umfasst Quantität die nötigen Operationen, um mit messbaren Werten zu rechnen und sie zu vergleichen. Hinzu kommen Operationen zur Ein- und Ausgabe.

Dazu gehört die Prüfung, ob eine Rechenoperation mit zwei unterschiedlichen Einheiten überhaupt zulässig ist. 20 Kilogramm kann nicht zu 2 Metern addiert werden. Zusätzlich kann erkannt werden, falls für die Ausführung einer Rechenoperation lediglich eine Umrechnung notwendig ist, wie bei der Addition von 2 Metern und 3 Kilometern. Sobald mehrere Einheiten unterschieden werden müssen, sollte die Umrechnung allerdings nicht mehr von Quantität selbst durchgeführt, sondern in das Muster Umwandlungsverhältnis ausgelagert werden. Ähnliche Prüfungen sind auch beim Vergleichen von Quantitäten notwendig.

Weitere Operationen werden zum Einlesen und zur Ausgabe zur Verfügung gestellt („toString()“ und „parse(String)“ in der Abbildung). Diese erlauben die Ausgabe als Zeichenkette, genauso wie das Einlesen einer Zeichenkette in Quantität. Meist wird dabei eine Darstellung gewählt, bei der zunächst der Betrag und dann die Einheit ausgegeben wird, z. B. „5 Sekunden“.

Beispiele und zugehörige Erläuterungen

(1) Wir betrachten zum besseren Verständnis folgenden Aussagesatz:

Die Temperatur beträgt 38 Grad-Celsius.

Diese Aussage beinhaltet 2 Begriffe und einen Zahlenwert. Die Begriffe müssen klar getrennt werden. Der Zahlenwert ist bereits eindeutig. Wir betrachten daher jeden Begriff als eigenen Typen und lassen dann beide Typen in eine Beziehung treten. Die Beziehung stellt dann den Zusammenhang zwischen den Typen dar und wird durch ein Verb gekennzeichnet. Der Zahlenwert (Betrag) wird dann dem jeweils passenden Typ zugeordnet. In diesem Falle stellt der Begriff „Temperatur“ den Raum dar, in dem sich die Objekte befinden. Die einzelnen Objekte selbst werden durch die Einheit mit dem Namen „Grad-Celsius“ dargestellt, von denen im Beispiel genau 38 gezählt werden können.

(2) Ein wichtiger Gesichtspunkt bei der Typenzuordnung ist die sinnvolle bzw. korrekte Verwendung der Begriffe zur Vermeidung von fehlerhaften Interpretationen. Vertauschungen von Begriffen müssen daher unbedingt vermieden werden. Ein anderes Augenmerk sollte auch auf die zwingende Notwendigkeit bei der Verwendung des Analysemusters „Quantity“ gelegt werden. Für jeden Einzelfall ist dieser Aspekt dann getrennt zu betrachten. Die folgende Aussage soll die Zusammenhänge verdeutlichen:

Das Buch besteht aus 250 Seiten.

Eine Vertauschung der Begriffe „Buch“ und „Seite“ im Satz würde hier keinen Sinn ergeben. In der Softwaretechnik gibt es dann einen Oberbegriff „Buch“ als Klasse mit einem Attribut „Seitenzahl“. Es ist hierbei nicht erforderlich, die Anzahl der Seiten als „Quantity“ zu programmieren.

Geld

Werden monetäre Werte (Währungen) mit Quantität modelliert, spricht man auch vom Analysemuster Geld (englisch Money). Geld ist also nur ein Spezialfall von Quantität, bei dem die Einheit durch die Währung repräsentiert wird – das Konzept unterscheidet sich nicht.

Bei der Darstellung von Währungen steht man vor der Entscheidung, diese Objekt-Eigenschaft entweder als Attribut in der Objekt-Klasse zu implementieren oder einen neuen Datentypen als eigene Klasse zur Aufnahme der entsprechenden Attribute zu generieren. Es gibt verschiedene Währungen, denen bestimmte Namen eindeutig zugeordnet sind. Aufgrund dieser Tatsache ist bereits die Notwendigkeit zur Bildung einer eigenen Klasse erkennbar. In der praktischen Umsetzung wird dann eine eigene Klasse für den Grundtyp des Geldes mit einem sinnvollen Klassennamen erstellt (z. B. „Money“ oder „Geld“). An diese Klasse kann dann über eine Assoziation eine Unterklasse angehängt werden, die die verschiedenen Währungseinheiten dem Grundtyp „Money“ eindeutig zuordnet.

Ein Unterschied ergibt sich jedoch daraus, dass sich die Umrechnungsfaktoren von Geldeinheiten im Gegensatz zu den physikalischen Größen mit der Zeit ändern. Eine weitere zusätzliche Eigenschaft von Geld betrifft das Runden von Zahlen. Nicht immer ist beim Umgang mit Geldeinheiten das mathematische Runden gewünscht. Geld kann zu diesem Zweck zusätzliche Rundungsregeln definieren. Beispielsweise kann beim Auszahlen von Geldmünzen gefordert werden, dass auf den nächsten Betrag aufgerundet wird, für den reale Münzen existieren.

Ein ähnliches Problem tritt auf, wenn beispielsweise 100 Euro an drei Parteien ausgezahlt werden sollen (100 geteilt durch 3). Ein Ergebnis von 33,33 Euro stellt nicht zufrieden, da insgesamt nur 99,99 Euro ausgezahlt würden und sozusagen 1 Cent verloren ginge. Man kann sich die Lösung des Problems so vorstellen, dass Geld zweimal 33,33 Euro und einmal 33,34 Euro als Ergebnis liefert. Eine Partei hat Glück und erhält also einen zusätzlichen Cent. Bei der Programmierung kann dies durch Rückgabe eines Containers realisiert werden.

Ein Geld-Objekt ist ein unveränderliches Wertobjekt, d. h. Berechnungen mit einem Geld-Objekt führen nicht zur Veränderung des Objektes selbst, sondern erzeugen als Ergebnis ein neues Geld-Objekt.

Der folgende Java-Quelltext zeigt eine Methode zur Multiplikation. Es wird ein neues Objekt vom Typ Geld erzeugt.

public Geld multipliziere(double arg) {
   return new Geld(betrag * arg, währung);
}

Literatur

Weblinks