Partitionierung von Modellen mit Faktor-IPS
Spartenübergreifende Beitragsberechnung unter Verwendung der Derived Union Beziehung
Da wir nun in der spartenübergreifenden Klasse Vertrag auf alle Deckungen zugreifen können, können wir auch Teile der Beitragsberechnung spartenübergreifend implementieren. Der Jahresbasisbeitrag des Vertrag-Objekts entspricht immer der Summe der Beiträge seiner Deckungen. Die Berechnung des Beitrags der einzelnen Deckung ist dann natürlich wieder sparten- und deckungsspezifisch.
Konkrete und Abstrakte Methode in Deckung anlegen
Um im spartenübergreifenden Modell die Beitragsberechnung von Deckungen aufrufen zu können, stellen wir in der Klasse Deckung zunächst sicher, dass das abgeleitete Attribut (abgeleitet durch expliziten Methodenaufruf) jahresbasisbeitrag vom Typ Money korrekt konfiguriert wurde und legen anschließend zwei neue Methoden an. Dazu gehen wir im Vertragsteileditor von Deckung auf den Reiter Verhalten und klicken dort im Bereich Methoden auf Neu. Die erste Methode ("berechneJahresbasisbeitrag") konfigurieren wir mit Rückgabetyp void im Dialog wie folgt:
Die zweite Methode wird als abstrakt markiert und erhält den Rückgabetyp Money.
Faktor-IPS generiert daraus in der Klasse Deckung die folgende abstrakte Methode:
public abstract Money berechneJahresbasisbeitragInternal();
Diese Methode rufen wir in der Implementierung von berechneJahresbasisbeitrag auf und setzen den Code auf @generated NOT:
/**
* @since 1.0
*
* @generated NOT
*/
@IpsGenerated
public void berechneJahresbasisbeitrag() {
jahresbasisbeitrag = berechneJahresbasisbeitragInternal();
}
Berechnungsmethode im Vertrag implementieren
Nun können wir die Berechnung des Jahresbasisbeitrags in der Klasse Vertrag implementieren. Analog legen wir dort eine nicht abstrakte Methode berechneJahresbasisbeitrag an. Im generierten Java-Code ersetzen wir die leere Implementierung durch nachfolgende Logik.
Damit der Faktor-IPS Codegenerator die eigene Implementierung bei einem Build nicht neu generiert und somit verwirft, ergänzen wir die @generated-Annotation mit einem NOT:
|
/**
* @since 1.0
* @generated NOT
*/
public void berechneJahresbasisbeitrag() {
getDeckungen().forEach(Deckung::berechneJahresbasisbeitrag);
jahresbasisbeitrag = getDeckungen().stream()
.map(Deckung::getJahresbasisbeitrag)
.collect(Money.sum())
.orElse(Money.NULL);
}
Methode in HausratGrunddeckung überschreiben
In den spartenspezifischen Deckungsklassen legen wir die Methode berechneJahresbasisbeitragInternal ebenfalls über den IPS-Editor an. Hierzu gehen wir im Reiter Verhalten nun auf Override und wählen die in der Superklasse definierte Methode aus. Anschließend implementieren wir die konkrete Logik im Java-Editor - dies kann zur Übung einfacher gestaltet werden oder wie im Einführungstutorial über eine Tabelle. Für HausratGrunddeckung sieht die Implementierung beispielsweise so aus:
/**
* @since 1.0
*
* @generated NOT
*/
@Override
@IpsGenerated
public Money berechneJahresbasisbeitragInternal() {
TariftabelleHausrat tabelle = getTariftabelle();
if (tabelle != null) {
TariftabelleHausratRow row = tabelle.findRowNullRowReturnedForEmptyResult(hausratVertrag.getTarifzone());
return hausratVertrag.getVersSumme()
.divide(1000, RoundingMode.HALF_UP)
.multiply(row.getBeitragssatz(), RoundingMode.HALF_UP);
}
return Money.NULL;
}
Auch hier gilt es, das @generated um ein NOT zu ergänzen, damit der Codegenerator die Methode nicht neu generiert.