Das Regel­modul

et rechnungsbetrag 01

LF-ET ge­ne­riert aus der Ent­schei­dungs­tabelle das Regel­modul als Klasse mit

  • einer 'execute-Methode', die als Über­gabe­wert eine Implemen­tierung des Inter­faces erhält

  • einem 'IF-ELSE-Baum', dessen best­mögliche Struktur (d.h. die optimale Reihen­folge und Schachtelung der Bedingungen) bei jeder Ge­ne­rie­rung komplett neu berechnet wird

Der IF-ELSE-Baum arbeitet ausschließlich mit den Methoden des Interfaces.

7 Regeln ⇒ 7 Programm-Zweige

Die Ent­schei­dungs­tabelle hat 7 Regeln, der IF-ELSE-Baum 7 exakt dazu passende logische Programm-Zweige:

// *** WARNING: DO NOT MODIFY *** This is a generated Java source code! 
// 
// Generated by LF-ET 2.4.1 (260219a), https://www.lohrfink.de/lfet
// From decision table
// "/src/main/resources/lfet/demo/Rechnungsbetrag.lfet"
// 24.02.2026 11:20
// 

// Prolog Standard ---->
// profile LFET.Java.Prolog.Standard.Interface.Dt.ini not found
// used LF-ET 2.4.1 (260219a) build in default

package lfet.demo;

import javax.annotation.processing.Generated;

@Generated("LF-ET")
public class Rechnungsbetrag_rulesEngine
{
    public void execute(Rechnungsbetrag_iFace iface)
    {

    // Prolog Standard <----

        if (iface.isBestellwert_Kleiner2000())
        {
            // Rule R01 ---->
            
            iface.doTrace("Rechnungsbetrag", "20260224.112051", 7, 1);
            
            iface.doPortoBerechnen();
            iface.doRechnungsbetrag_Akt();
            
            // Rule R01 <----
        }
        else if (iface.isBestellwert_20007500())
        {
            if (iface.isRabatt_Groesser0())
            {
                if (iface.isRabattvariante_ProzentualerNachlassAufDenBestellwert())
                {
                    // Rule R02 ---->
                    
                    iface.doTrace("Rechnungsbetrag", "20260224.112051", 7, 2);
                    
                    iface.doRabattBeruecksichtigen();
                    iface.doPortoBerechnen();
                    iface.doRechnungsbetrag_Akt();
                    
                    // Rule R02 <----
                }
                else // Rabattvariante EUR - fester Betrag, wird von Bestellwert abgezogen
                {
                    if (iface.isRabattKleinerBestellwert())
                    {
                        // Rule R03 ---->
                        
                        iface.doTrace("Rechnungsbetrag", "20260224.112051", 7, 3);
                        
                        iface.doRabattBeruecksichtigen();
                        iface.doPortoBerechnen();
                        iface.doRechnungsbetrag_Akt();
                        
                        // Rule R03 <----
                    }
                    else // Rabatt < Bestellwert N - Nein
                    {
                        // Rule R04 ---->
                        
                        iface.doTrace("Rechnungsbetrag", "20260224.112051", 7, 4);
                        
                        iface.doPortoBerechnen();
                        iface.doRechnungsbetrag_Akt();
                        
                        // Rule R04 <----
                    }
                }
            }
            else // Rabatt ohne - es wurde kein Rabatt erfasst
            {
                // Rule R05 ---->
                
                iface.doTrace("Rechnungsbetrag", "20260224.112051", 7, 5);
                
                iface.doPortoBerechnen();
                iface.doRechnungsbetrag_Akt();
                
                // Rule R05 <----
            }
        }
        else // Bestellwert > 75,00 - hoch
        {
            if (iface.isRabatt_Groesser0())
            {
                // Rule R06 ---->
                
                iface.doTrace("Rechnungsbetrag", "20260224.112051", 7, 6);
                
                iface.doRabattBeruecksichtigen();
                iface.doRechnungsbetrag_Akt();
                
                // Rule R06 <----
            }
            else // Rabatt ohne - es wurde kein Rabatt erfasst
            {
                // Rule R07 ---->
                
                iface.doTrace("Rechnungsbetrag", "20260224.112051", 7, 7);
                
                iface.doRechnungsbetrag_Uebern();
                
                // Rule R07 <----
            }
        }

        // Epilog Standard ---->
        // profile LFET.Java.Epilog.Standard.Interface.Dt.ini not found
        // used LF-ET 2.4.1 (260219a) build in default

    }
}

// Epilog Standard <----

// End of generated Java source code
// Generated by LF-ET 2.4.1 (260219a), https://www.lohrfink.de/lfet

 

  • Diese Software altert nicht!

    • Dank kompletter Neu-Berechnung und Generierung bei jeder fachlichen Änderung

  • GARANTIERT:

    • Dauerhaft 100%ige Übereinstimmung mit der fachlichen Vorgabe

    • Gleiche logische Qualität wie die Entscheidungstabelle: Vollständig, Redundanz- und Wi­der­spruchs­frei

    • Immer perfekt erfüllt: Bidirektionale Rückverfolgbarkeit

  • GARANTIERT: Optimale Performanz

    • Keine Rules Engines, kein Rules Server ⇒ just Plain Code

    • Der Aufwand, die jeweils richtige ​Regel​ zu finden, wird nicht permanent zur Laufzeit, sondern nur einmalig bei der Generierung erbracht:

      • Berechnung der bestmöglichen Reihenfolge und Schachtelung der Bedingungen

      • Kleinstmögliche Anzahl an Bedingungs­auswer­tungen zur Lauf­zeit

Der Trace-Code

}
else // Rabattvariante EUR - fester Betrag, wird von Bestellwert abgezogen
{
    if (iface.isRabattKleinerBestellwert())
    {
        // Rule R03 ---->

        iface.doTrace("Rechnungsbetrag", "20260224.112051", 7, 3);

        iface.doRabattBeruecksichtigen();
        iface.doPortoBerechnen();
        iface.doRechnungsbetrag_Akt();

        // Rule R03 <----
    }
    else // Rabatt < Bestellwert N - Nein
    {

Der Trace-Code muss nicht verwendet werden, das wäre aber schade, denn der Nutzen ist enorm:

  • Automatisch immer perfekt positioniert

    • erstes Statement in jeder Regel

    • vor Ausführung der ersten Aktion

    • d.h. die Kombinatorik der Eingangswerte ‑ und damit die auszuführende Regel ‑ steht final fest

    • alle beteiligten Objekte sind noch im "unberührten" Zu­stand VOR der Verarbeitung durch die Regel

    • Beim Debuggen würde man das einen perfekten Break-Point nennen

  • Um das Verhalten der Software nach­voll­zie­hen zu können

    • genügen die Protokolle der Trace-Ausgaben

    • und die Ent­schei­dungs­tabellen

    • niemand muss mehr Sourcecode lesen

    • auch Wiederholungsläufe zur Reproduktion und Analyse von Fehlverhalten sind in der Regel nicht mehr notwendig