Der generierte Sourcecode
Der folgende Sourcecode ist das Ergebnis der Generierung des Beispieles. Er beginnt mit einem Kommentar-Header, dann folgen der Prolog, die Entscheidungstabellen-Regeln (der IF-ELSE-Regelbaum) mit Fehlerbehandlung und zum Schluss Epilog und Abschluss-Kommentar:
D:\Projekte\LF-ET-Demo\Cs\Compare.cs
using System;
namespace LfetDemo
{
public class Compare
{
public const string S1IsLessThanS2 = "String 1 ist kleiner als String 2";
public const string S1IsEqualToS2 = "String 1 ist gleich String 2";
public const string S1IsGreaterThanS2 = "String 1 ist größer als String 2";
public string CompareStrings(string s1, string s2)
{
var result = "";
var compareS1ToS2 = s1 != null && s2 != null
? s1.CompareTo(s2) // liefert immer -1, 0 oder 1
: -2;
// Prolog Decision Table <----
#region Rules
var lfetCompareRuleExecuted = false;
// Condition B01: String 1 kleiner String 2 ?
if (compareS1ToS2 == -1 {vbar}{vbar} s1 == null && s2 != null)
{
// Rule R01 ---->
lfetCompareRuleExecuted = true;
// Action A01: Ergebnis: String 1 ist kleiner als String 2
result = S1IsLessThanS2;
// Rule R01 <----
}
else
{
// Condition B02: String 1 größer String 2 ?
if (compareS1ToS2 == 1 {vbar}{vbar} s1 != null && s2 == null)
{
// Rule R02 ---->
lfetCompareRuleExecuted = true;
// Action A02: Ergebnis: String 1 ist größer als String 2
result = S1IsGreaterThanS2;
// Rule R02 <----
}
else
{
// Rule R03 ---->
lfetCompareRuleExecuted = true;
// Action A03: Ergebnis: String 1 ist gleich String 2
result = S1IsEqualToS2;
// Rule R03 <----
}
}
if (!lfetCompareRuleExecuted)
{
// Error ---->
// profile LFET.CS.Error.ini not found
// used LF-ET 2.1.4 (130731a) build in default
System.Console.WriteLine("No rule executed in decision table 'Compare'");
System.Environment.Exit(-1);
// Error <----
}
#endregion Rules
// Epilog Decision Table ---->
return result;
}
}
}
Betrachten wir die einzelnen Abschnitte des Sourcecodes noch etwas genauer, zuerst den generierten Header-Kommentar. Hier finden sich Informationen zum Zeitpunkt der Generierung, aus welcher Entscheidungstabelle und mit welcher LF-ET-Version der Sourcecode generiert wurde:
Bei Bedarf kann LF-ET auch einen individuell gestaltbaren Projekt-Header vor diesen LF-ET-Header einbinden, nähere Informationen dazu finden Sie im Kapitel Individueller Header.
Speziell für C# wird ein Standard-Prolog generiert (using System), der am Anfang des generierten Sourcecode steht. Weitere Informationen dazu siehe Kapitel Cs/C# Standard Prolog.
using System;
Danach folgt der Entscheidungstabellen-Prolog, Anfang und Ende sind an den generierten Kommentaren gut erkennbar:
namespace LfetDemo
{
public class Compare
{
public const string S1IsLessThanS2 = "String 1 ist kleiner als String 2";
public const string S1IsEqualToS2 = "String 1 ist gleich String 2";
public const string S1IsGreaterThanS2 = "String 1 ist größer als String 2";
public string CompareStrings(string s1, string s2)
{
var result = "";
var compareS1ToS2 = s1 != null && s2 != null
? s1.CompareTo(s2) // liefert immer -1, 0 oder 1
: -2;
// Prolog Decision Table <----
Direkt vor der ersten Bedingung des IF-ELSE-Regelbaumes bindet LF-ET bei C# noch eine boolsche Hilfsvariable 'lfetCompareRuleExecuted' ein. Sie dient dazu zu erkennen, ob eine Regel ausgeführt wurde oder nicht:
Die Elemente des IF-ELSE-Regelbaumes sind durch Leerzeilen voneinander getrennt und ausführlich kommentiert, wobei dazu die fachlichen Texte aus der Entscheidungstabelle verwendet werden. Die Regel-Reihenfolge entspricht grundsätzlich immer der Standardsortierung.
#region Rules
var lfetCompareRuleExecuted = false;
// Condition B01: String 1 kleiner String 2 ?
if (compareS1ToS2 == -1 {vbar}{vbar} s1 == null && s2 != null)
{
// Rule R01 ---->
lfetCompareRuleExecuted = true;
// Action A01: Ergebnis: String 1 ist kleiner als String 2
result = S1IsLessThanS2;
// Rule R01 <----
}
else
{
// Condition B02: String 1 größer String 2 ?
if (compareS1ToS2 == 1 {vbar}{vbar} s1 != null && s2 == null)
{
// Rule R02 ---->
lfetCompareRuleExecuted = true;
// Action A02: Ergebnis: String 1 ist größer als String 2
result = S1IsGreaterThanS2;
// Rule R02 <----
}
else
{
Direkt nach dem IF-ELSE-Regelbaum erfolgt die Auswertung der boolschen Hilfsvariablen 'lfetCompareRuleExecuted'. Sie kann nur 'false' sein, wenn keine Regel ausgeführt wurde, d.h. die Entscheidungstabelle hat versagt (konnte den aktuellen Systemzustand nicht verarbeiten!). Dieses Fehlverhalten kann nur auftreten, wenn erweiterte Bedingungen verwendet werden und ein systemseitig möglicher (und auch aufgetretener) Bedingungs-Wert bei der Spezifikation nicht beachtet wurde. Dies wertet LF-ET standardmäßig als schweren (Spezifikations-) Fehler und beendet die Programmausführung mit System.Environment.Exit(-1). Die Behandlung dieses Fehlers kann bei Bedarf individuell angepasst oder auch deaktiviert werden, siehe hierzu Kapitel Fehlerbehandlung (optional).
if (!lfetCompareRuleExecuted)
{
// Error ---->
// profile LFET.CS.Error.ini not found
// used LF-ET 2.1.4 (130731a) build in default
System.Console.WriteLine("No rule executed in decision table 'Compare'");
System.Environment.Exit(-1);
// Error <----
}
#endregion Rules
Den Abschluss bildet der Epilog, in unserem Beispiel wird das im IF-ELSE-Regelbaum ermittelte Ergebnis zurückgegeben, Methode und Klasse beendet:
// Epilog Decision Table ---->
return result;
}
}
}