Anpassung der Implementierung

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

impl 01 impl

  • Das Interface ist jetzt stateless und generisch, d.h. zu­stands­los und typisiert, der Typ ist ein zu­sätz­licher 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: &lt; 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: &gt;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 &lt; 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&uuml;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: &uuml;bern. - Bestellwert kann als Rechnungsbetrag &uuml;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);
      }

}