Anpassung der Implementierung
Die Anpassungen der Implementierung an das neue Interface sind schnell erledigt:

-
Das Interface ist jetzt stateless und generisch, d.h. zustandslos und typisiert, der Typ ist ein zusätzlicher Parameter in allen Methoden
-
Das Modell ist kein Instanz-Objekt mehr, sondern wird in allen Methoden als Argument übergeben
-
Die Methoden-Namen bei den Enums sind sprechender
-
nicht mehr isEnum oder doEnum
-
sondern z.B. isBestellwert
-
-
Ein zusätzlicher Trace-Code, der NACH jeder Regelausführung aufgerufen wird, wurde noch am Ende eingefügt
Die angepasste Implementierung des Interfaces:
package lfet.demo;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class Rechnungsbetrag implements Rechnungsbetrag_iFace<Rechnungsbetrag_model> {
private final Rechnungsbetrag_rulesEngine rulesEngine = new Rechnungsbetrag_rulesEngine();
public void berechneRechnungsbetrag(Rechnungsbetrag_model model) {
model.setRechnungRabatt(BigDecimal.ZERO);
model.setRechnungPorto(BigDecimal.ZERO);
model.setRechnungBetrag(BigDecimal.ZERO);
rulesEngine.execute(this, model);
}
/**
* @param d any double value,
* NEGATIVE_INFINITY will be replaced Double.MAX_VALUE * -1.0,
* POSITIVE_INFINITY will be replaced Double.MAX_VALUE
* @return the value as BigDecimal, scale 2, RoundingMode.HALF_UP
*/
public BigDecimal bigDecimal(double d) {
return new BigDecimal(Double.toString(
d < Double.MAX_VALUE * -1.0 ? Double.MAX_VALUE * -1.0
: Math.min(d, Double.MAX_VALUE)))
.setScale(2, RoundingMode.HALF_EVEN);
}
/**
* <b>B01: Bestellwert</b><br>
* <br>
* <b>B01/01: < 20,00 - gering</b>
*/
@Override
public boolean isBestellwert(Rechnungsbetrag_iFace.Bestellwert arg0, Rechnungsbetrag_model model) {
return model.getBestellwert().compareTo(bigDecimal(arg0.getSymbolMin())) >= 0 &&
model.getBestellwert().compareTo(bigDecimal(arg0.getSymbolMax())) <= 0;
}
/**
* <b>B02: Rabatt</b><br>
* <br>
* <b>B02/01: >0 - Rabatt wurde erfasst</b>
*/
public boolean isRabatt_Groesser0(Rechnungsbetrag_model model) {
return model.getRabatt().compareTo(BigDecimal.ZERO) > 0;
}
/**
* <b>B03: Rabattvariante</b><br>
* <br>
* <b>B03/01: % - prozentualer Nachlass auf den Bestellwert</b>
*/
@Override
public boolean isRabattvariante_ProzentualerNachlassAufDenBestellwert(Rechnungsbetrag_model model) {
return model.isRabattProzent();
}
/**
* <b>B04: Rabatt < Bestellwert</b><br>
* <br>
* <b>B04/01: J - Ja</b>
*/
@Override
public boolean isRabattKleinerBestellwert(Rechnungsbetrag_model model) {
return model.getRabatt().compareTo(model.getBestellwert()) < 0;
}
/**
* <b>A01: Rabatt berücksichtigen</b>
*/
@Override
public void doRabattBeruecksichtigen(Rechnungsbetrag_model model) {
model.setRechnungRabatt(model.isRabattProzent()
? model.getBestellwert()
.multiply(model.getRabatt())
.multiply(bigDecimal(0.01))
.setScale(2, RoundingMode.HALF_UP)
: model.getRabatt());
}
/**
* <b>A02: Porto berechnen</b>
*/
@Override
public void doPortoBerechnen(Rechnungsbetrag_model model) {
model.setRechnungPorto(model.getPorto());
}
/**
* <b>A03: Rechnungsbetrag</b><br>
* <br>
* <b>A03/01: akt. - Rechnungsbetrag muss aktualisiert werden</b>
*/
@Override
public void doRechnungsbetrag_Akt(Rechnungsbetrag_model model) {
model.setRechnungBetrag(
model.getBestellwert()
.subtract(model.getRechnungRabatt())
.add(model.getRechnungPorto()));
}
/**
* <b>A03: Rechnungsbetrag</b><br>
* <br>
* <b>A03/02: übern. - Bestellwert kann als Rechnungsbetrag übernommen werden</b>
*/
@Override
public void doRechnungsbetrag_Uebern(Rechnungsbetrag_model model) {
model.setRechnungBetrag(model.getBestellwert());
}
/**
* @param dtName - Name der Entscheidungstabelle
* @param version - Zeitstempel der Generierung
* @param rules - Anzahl Regeln in der Entscheidungstabelle
* @param rule - Regel der Entscheidungstabelle, die jetzt ausgeführt wird
*/
@Override
public void doTrace(String dtName, String version, int rules, int rule, Rechnungsbetrag_model model) {
System.out.printf("%s, %s, %d, %d, %s\n", dtName, version, rules, rule, model);
}
/**
* @param dtName - Name der Entscheidungstabelle
* @param version - Zeitstempel der Generierung
* @param rules - Anzahl Regeln in der Entscheidungstabelle
* @param rule - Regel der Entscheidungstabelle, die jetzt ausgeführt wird
*/
@Override
public void doTraceAfterRule(String dtName, String version, int rules, int rule, Rechnungsbetrag_model model) {
System.out.printf("%39s %s\n\n", "", model);
}
}