Implementierung des Interfaces

Die Klasse Rechnungsbetrag

impl 01 impl

  • wird einmalig manuell erstellt

  • implementiert alle Methoden des generierten Inter­faces

  • stellt eine Methode bereit, mit der das Regel­modul ausge­führt werden kann

  • stellt ggf. weitere Hilf­smethoden bereit, in unserem Beispiel eine Konver­tierung von double nach BigDecimal

Gängige Entwicklungs-Werkzeuge, wie z.B. IntelliJ, Eclipse oder Visual Studio Code, können "auf Knopf­druck" aus einem Inter­face eine Implemen­tierung generieren, sodass im Wesent­lichen nur noch die Methoden inhalt­lich aus­programmiert werden müssen, in diesem Beispiel sind das alle Methoden mit der Anno­tation @Override.

Die Implementierung des Interfaces:
package lfet.demo;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Rechnungsbetrag implements Rechnungsbetrag_iFace {

    private final Rechnungsbetrag_rulesEngine rulesEngine = new Rechnungsbetrag_rulesEngine();

    private Rechnungsbetrag_model model;

    public void berechneRechnungsbetrag(Rechnungsbetrag_model model) {

        this.model = model;
        this.model.setRechnungRabatt(BigDecimal.ZERO);
        this.model.setRechnungPorto(BigDecimal.ZERO);
        this.model.setRechnungBetrag(BigDecimal.ZERO);

        rulesEngine.execute(this);
    }

    /**
     * @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_Kleiner2000() {
        return model.getBestellwert().compareTo(bigDecimal(20.00)) < 0;
    }

    /**
     * <b>B01: Bestellwert</b><br>
     * <br>
     * <b>B01/02: 20,00 - 75,00 - normal</b>
     */
    @Override
    public boolean isBestellwert_20007500() {
        return model.getBestellwert().compareTo(bigDecimal(20.00)) >= 0 &&
                model.getBestellwert().compareTo(bigDecimal(75.00)) <= 0;
    }

    /**
     * <b>B02: Rabatt</b><br>
     * <br>
     * <b>B02/01: &gt;0 - Rabatt wurde erfasst</b>
     */
    public boolean isRabatt_Groesser0() {
        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() {
        return model.isRabattProzent();
    }

    /**
     * <b>B04: Rabatt &lt; Bestellwert</b><br>
     * <br>
     * <b>B04/01: J - Ja</b>
     */
    @Override
    public boolean isRabattKleinerBestellwert() {
        return model.getRabatt().compareTo(model.getBestellwert()) < 0;
    }

    /**
     * <b>A01: Rabatt ber&uuml;cksichtigen</b>
     */
    @Override
    public void doRabattBeruecksichtigen() {
        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() {
        model.setRechnungPorto(model.getPorto());
    }

    /**
     * <b>A03: Rechnungsbetrag</b><br>
     * <br>
     * <b>A03/01: akt. - Rechnungsbetrag muss aktualisiert werden</b>
     */
    @Override
    public void doRechnungsbetrag_Akt() {
        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() {
        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) {
        System.out.printf("%s, %s, %d, %d, %s\n",
                dtName, version, rules, rule, model);
    }
}