public Double berechneJahresbeitrag() {
if (zahlweise == Zahlweise.EINMALZAHLUNG) {
return null;
}
if (zahlweise == Zahlweise.JAEHRLICH) {
return beitragZw;
}
if (zahlweise == Zahlweise.MONATLICH) {
return beitragZw * 12;
}
throw new RuntimeException("Unbekannte Zahlweise");
}
Datentypen & Aufzählungen in Faktor-IPS
Einleitung
Dieser Artikel erläutert wie neue Datentypen in Faktor-IPS definiert werden können, die nicht zum Standardumfang von Faktor-IPS gehören. Nach der Klärung der konzeptionellen Grundlagen erläutern wir zunächst, wie einerseits vordefinierte Datentypen und andererseits existierende Java-Klassen in einem Projekt als Datentyp verwendet werden können. Im Anschluss gehen wir ausführlich auf die Definition von Aufzählungen ein.
Der Artikel ist für Softwareentwickler mit Erfahrung in objektorientierter Modellierung geschrieben. Um die Beispiele im Detail nachvollziehen zu können, sollten Sie zudem die Faktor-IPS Einführungstutorials durchgearbeitet haben.
Konzeptionelle Grundlagen
Was ist ein Datentyp in Faktor-IPS?
Programmiersprachen bieten i.d.R. eine Menge an vordefinierten Datentypen, beispielsweise für ganze Zahlen, Gleitkommazahlen und Zeichenketten. Die Definition eines Datentyps in einer Programmiersprache besteht neben dem Namen des Datentyps aus der Festlegung der erlaubten Werte und der zulässigen Operationen [1].
Java bietet als vordefinierte Datentypen die primitiven Typen
-
boolean
-
die Typen
byte
,short
,int
,long
,char
für ganze Zahlen, -
sowie die Typen
float
unddouble
für Gleitkommazahlen.
Alle anderen Typen werden in Java als Reference Types bezeichnet.
Gemäß der Java Spezifikation sind damit sowohl die Wrapper-Klassen Boolean
, Integer
, etc. als auch Klassen wie String und Date Reference Types
[2].
In der OO-Programmierung werden Klassen (bzw. deren Instanzen) häufig in Value Objects und Reference Objects unterteilt.
Bei Value Objects ist die Gleichheit zwischen zwei Objekten über die Wertegleichheit ihrer Eigenschaften definiert, die Objekte haben keine Identität
[3].
Ein typisches Beispiel ist eine Klasse Money
zur Abbildung von Geldbeträgen.
Zwei Money-Objekte sind gleich, wenn Währung und Betrag gleich sind.
Dagegen gelten zum Beispiel zwei Personen-Objekte bei denen Name, Vorname und Geburtsdatum gleich sind, nicht automatisch als gleich, da es sich trotzdem um unterschiedliche Personen handeln kann.
Bei der Klasse Person
handelt es sich also um eine Reference Object.
In der UML wird der Begriff Datentyp im Sinne von Value Object verwendet.
A data type is a type whose instances are identified only by their value. A data type may contain attributes to support the modeling of structured data types. A typical use of data types would be to represent programming language primitive types or CORBA basic types. For example, integer and string types are often treated as data types.
Analog verwenden wir den Begriff in Faktor-IPS. Bezogen auf Java können damit alle primitiven Typen und alle Klassen, die eine Anwendung des Value Object Pattern sind, als Datentyp in Faktor-IPS verwendet werden.
Aufzählungen
Eine spezielle Art Datentyp sind Aufzählungen (Enumerationen/Enums). Bei einer Aufzählung wird der Wertebereich – wie der Name schon sagt – durch Aufzählen der einzelnen Werte definiert. Zum Beispiel kann man die möglichen Zahlweisen aufzählen:
-
Monatlich
-
Quartalsweise
-
Halbjährlich
-
Jährlich
-
Einmalzahlung
Häufig werden die einzelne Werte von Aufzählungen im Programmcode referenziert. Möchte man zum Beispiel aus dem Beitrag gemäß Zahlweise den Jahresbeitrag ermitteln, könnte dies wie folgt aussehen:
Dieser Programmcode ist abhängig von den konkreten Werte der Aufzählung
[4].
Das hat zur Folge, dass das Löschen oder Hinzufügen von Werten mit Änderungen am Programmcode verbunden ist.
Bei diesem Beispiel kann man die Abhängigkeit des Programmcodes von den konkreten Werten vermeiden, indem man zur Zahlweise ein Attribut anzahlZahlungenProJahr
hinzufügt.
Die obige Methode lässt sich dann wie folgt implementieren:
public Double berechneJahresbeitrag() {
if (zahlweise.getAnzahlZahlungenProJahr()==null) {
return null;
}
return beitragZw * zahlweise.getAnzahlZahlungenProJahr();
}
Der Programmcode ist nun unabhängig von den konkreten Werten. Man kann eine wöchentliche Zahlweise ohne Änderung des Programmcodes hinzufügen, und genauso die monatliche Zahlweise entfernen.
1 http://de.wikipedia.org/wiki/Datentyp.
2 https://docs.oracle.com/javase/specs/jls/se11/html/jls-4.html#jls-4.3
3 s. Fowler, Patterns of Enterprise Application Architecture, S. 486
4 Im Falle von numerischen Werten spricht man auch von „Magic Numbers