StructorizerHandbuch DE

CASE-Anweisung

Was ist eine CASE-Anweisung?

Ein CASE-Element (oder „Selektion") stellt eine Mehrfachverzweigung des Kontrollflusses innerhalb eines Algorithmus dar. Der zu wählende Zweig wird durch einen Vergleich des Werts des Steuerausdrucks (Diskriminator) im Elementkopf mit den Werten (Selektoren) in den Zweigköpfen bestimmt. Die Anzahl der Zweige hängt von der Anzahl der Selektorzeilen ab, die Sie in das Textfeld eingeben (siehe unten). Eine CASE-Struktur kann einen „Auffangzweig" (genannt default-, else- oder otherwise-Zweig) bereitstellen, der am weitesten rechts positioniert ist und alle Diskriminatorwerte auffängt, die mit keinem expliziten Selektor übereinstimmen.

Im Gegensatz zu einer IF-Anweisung ist der steuernde Ausdruck (Diskriminator) nicht vom Booleschen Typ, sondern liefert typischerweise eine ganze Zahl oder ein Zeichen (in Structorizer kann er auch zu einem String ausgewertet werden), allgemeiner gesagt einen unterscheidbaren Wert aus einer Menge diskreter (in der Regel einfacher) Werte. Die Selektorwerte sind dann Konstanten (Literale) dieses Datentyps, gegen die der tatsächliche Wert des Diskriminatorausdrucks geprüft wird.

CASE-Elemente eignen sich hervorragend für Aufzählungstypen, machen jedoch weder für Gleitkommazahlen noch für strukturierte Objekte Sinn. Für Boolesche Werte bieten sie keinen Vorteil gegenüber einer IF-Anweisung. (Selbst wenn Structorizer hier sehr tolerant ist: Wenn Sie einen Code-Export beabsichtigen, vergessen Sie nicht, dass viele Programmiersprachen die Anwendbarkeit auf nicht-ganzzahlige Typen ablehnen. Überlegen Sie daher zweimal, ob Sie die zugehörigen Analyser-Warnungen ignorieren wollen.)

Einfügen eines neuen CASE-Elements

Um ein CASE-Element hinzuzufügen, wählen Sie das Element aus, vor oder nach dem es eingefügt werden soll.

CASE-Anweisung einfügen
CASE-Anweisung einfügen

Drücken Sie dann die mit einem roten Rahmen markierte Symbolleisten-Schaltfläche im obigen Screenshot, oder wählen Sie einen der Menüeinträge "Add › Before › CASE statement" oder "Add › After › CASE statement" im Kontextmenü oder im Menü "Diagram". (Oder drücken Sie einfach eine der Funktionstasten <F10> oder <Shift><F10>, je nachdem, ob das CASE-Element nach oder vor dem aktuell ausgewählten Element eingefügt werden soll.) Dadurch öffnet sich der Element-Editor für eine neue CASE-Anweisung.

Seit Version 3.30-15 bietet Structorizer einen spezifischen Editor für CASE-Anweisungen, der weiter unten beschrieben wird. Zunächst wird die traditionelle Editor-Variante erläutert, da sie die Struktur des (internen) Elementtextes und damit den Standardtext, der in den Struktureinstellungen angegeben werden kann, am besten verdeutlicht. Welche der beiden Editor-Varianten geöffnet wird, hängt von einem Kontrollkästchen in den Struktureinstellungen ab.

Mit dem traditionellen universellen Element-Editor erhalten Sie einen mehrzeiligen Textbereich, in dem die steuernden Informationen direkt eingegeben und bearbeitet werden können:

Ausgefüllter CASE-Editor
Ausgefüllter CASE-Editor

Der in ein CASE-Formular einzugebende mehrzeilige Text wird wie folgt interpretiert:

  • Zeile 1: der auszuwertende Diskriminatorausdruck (im obigen Beispiel: Variable A);
  • Zeilen 2..(n-1): ein oder mehrere konstante Werte (durch Kommas zu trennen), bei deren ersten Übereinstimmung (d. h. Gleichheit) mit dem Diskriminatorausdrucksergebnis die Ausführung in den zugehörigen (d. h. (i-1)-ten) Zweig geleitet wird;
  • Zeile n (die letzte Zeile): die Beschriftung des „else"-Zweigs. (Wie oben beschrieben, wird hier die Ausführung eingeleitet, wenn keiner der Selektorkonstanten aus den Zeilen 2..(n-1) mit dem Diskriminatorergebnis übereinstimmt.) Die Beschriftung selbst ist unerheblich, es sei denn, Sie benennen sie „%" (ohne Anführungszeichen) — dies unterdrückt den Standardzweig. Wenn Sie keine Anweisung in den Standardzweig legen möchten, können Sie ihn weglassen (indem Sie „%" in die letzte Zeile schreiben).

Beim Erstellen eines neuen CASE-Elements wird der Textbereich mit der entsprechenden Textvorlage vorbefüllt, die Sie in den Struktureinstellungen festlegen können.

Merken Sie sich: Wenn Sie eine CASE-Anweisung ohne Auffangzweig (auch „else-Teil") wünschen, muss die letzte Zeile „%" sein, andernfalls wird ein Standardzweig bereitgestellt, dessen Beschriftung der Inhalt der letzten Zeile ist.

Bei vielen Zweigen und/oder langen Selektorzeilen kann ein CASE-Element schnell sehr breit werden. Wenn lange Selektorzeilen der bestimmende Breitenfaktor sind, können Sie Zeilenumbrüche verwenden (d. h. eine lange Zeile in mehrere aufteilen, indem Sie am Ende unvollständiger Zeilen einen Backslash setzen). Sehen Sie das letzte Beispiel in der Tabelle unten.

Beispiele:

Inhalt des CASE-Texts Erzeugtes Diagramm
A
1
3
5
sinon
CASE-Anweisung mit Standardzweig
CASE-Anweisung mit Standardzweig
A
1
3
5
%
CASE-Anweisung ohne Standardzweig
CASE-Anweisung ohne Standardzweig
month
1,3,5,7,8,10,12
4,6,9,11
2
default
CASE-Struktur mit mehreren Werten je Zweig
CASE-Struktur mit mehreren Werten je Zweig
answer
"yes"
"no"
"sometimes",\
"don't know"
default
CASE-Struktur mit mehreren Werten je Zweig und weichem Zeilenumbruch
CASE-Struktur mit mehreren Werten je Zweig und weichem Zeilenumbruch

Nach dem Ausfüllen des Textbereichs des Element-Editors und dem Bestätigen (Schaltfläche „OK") könnte das Ergebnis wie im Screenshot unten aussehen. Sie können nun die verschiedenen Zweige mit passenden Elementen aus der Symbolleiste füllen:

Demoprogramm nach dem Einfügen der CASE-Anweisung
Demoprogramm nach dem Einfügen der CASE-Anweisung

Fertige Demo herunterladen

Die gezeichnete CASE-Struktur besteht aus:

  • dem Kopf (der die dreieckige Form mit dem Diskriminatorausdruck und die trapezförmigen Felder mit den Zweigselektoren umfasst) und
  • den jeweiligen Zweigen, die anfangs leere Folgen sind (angezeigt durch das ∅-Symbol).

Um Elemente in einen Zweig einzufügen, wählen Sie den entsprechenden Zweig aus und fügen Sie die benötigten Elemente wie gewohnt ein (siehe Diagram/Add element).

Um ein Element nach der gesamten CASE-Anweisung anzuhängen, wählen Sie zunächst den Kopf der CASE-Struktur aus und fügen Sie das folgende Element wie gewohnt hinzu (siehe Diagram/Add element).

Beim Kontrollfluss bedeutet das Durchlaufen eines CASE-Elements: Der Diskriminatorausdruck wird ausgewertet, und der Zweig, dessen Selektor mit dem Diskriminatorwert übereinstimmt, wird ausgeführt. Danach wird der Kontrollfluss an das nächste Element unterhalb der gesamten CASE-Anweisung übergeben — unabhängig vom gewählten Zweig. Stimmt keiner der Selektoren mit dem Auswahlwert überein, wird ohne Standardzweig direkt zum nachfolgenden Element weitergegangen, andernfalls wird zunächst der Standardzweig ausgeführt. (Ein leerer Standardzweig ist redundant.) Beachten Sie, dass ein weggelassener Standardzweig bei der Testabdeckungsprüfung einen Unterschied machen kann (siehe Abdeckungsregeln in der Laufzeitanalyse).

Bearbeiten eines vorhandenen CASE-Elements

Beim Bearbeiten eines vorhandenen CASE-Elements (z. B. nach Doppelklick oder Drücken der <Enter>-Taste, während der CASE-Kopf ausgewählt ist) können Sie natürlich Zeilen einfügen oder entfernen wie oben beschrieben. Beachten Sie jedoch, dass Zweige mit den Zeilen verknüpft sind. Im Gegensatz zu einem neuen CASE-Element sind diese Zweige in der Regel nicht leer, sondern enthalten bereits Anweisungen oder andere Elemente.

Bei Verwendung des traditionellen Editors (siehe oben) verschieben sich die Zweige nicht entsprechend, wenn Sie z. B. neue Fallzeilen einfügen. Stattdessen bleiben sie an ihrer ursprünglichen Position (linksbündig) statt an ihrem ursprünglich zugeordneten Selektor. (Dasselbe gilt für möglicherweise zugeordnete Zweigselektorfarben.) Beim ersten Beispiel der obigen Tabelle würde das Einfügen einer neuen Zeile „2" zwischen „1" und „3" zu einer Situation führen, in der die rot gefärbten Zweige nun falschen Selektoren zugeordnet sind und einer nach dem anderen nach rechts verschoben werden müssten, um die ursprüngliche Semantik wiederherzustellen.

Zweigzuordnungsfehler nach dem Einfügen einer Fallzeile
Zweigzuordnungsfehler nach dem Einfügen einer Fallzeile

Wenn Sie umgekehrt die Anzahl der Fallzeilen verringern, werden die überzähligen Zweige von rechts nach links automatisch beim Bestätigen gelöscht — unabhängig davon, welche Selektorzeilen Sie entfernt haben.

Zweigzuordnungsfehler nach dem Löschen einer Fallzeile
Zweigzuordnungsfehler nach dem Löschen einer Fallzeile

Seien Sie also vorsichtig beim Bearbeiten mit dem universellen Element-Editor! Wenn Sie Aufwand vermeiden möchten, fügen Sie neue Fälle vorzugsweise nahe dem Ende der Liste hinzu (obwohl der Standardfall immer der letzte sein muss) und kopieren Sie den Inhalt von Zweigen, die zu verschwinden drohen, bevor Sie damit beginnen, veraltete Selektorzeilen aus dem Text zu entfernen.

Genau hier kommt der CASE-spezifische Editor ins Spiel! Er ist seit Version 3.30-15 verfügbar (und wurde mit Version 3.30-16 erheblich erweitert). Er gibt Ihnen konsistente Kontrolle nicht nur über die Selektorzeilen, sondern auch über ihre zugehörigen Zweige (und die Zweigkopffarben):

Alternativer CASE-Editor
Alternativer CASE-Editor

Wie Sie sehen:

  • Der Diskriminatorausdruck (d. h. die erste Zeile des CASE-Texts) hat ein eigenes Textfeld (beschriftet „Choice expression:").
  • Jede Selektorzeile des Texts ist nun in einer Tabellenzeile (in der zweiten Spalte) unterhalb des Diskriminatortextfelds dargestellt (Beschriftung „Branch selectors:"). Die erste Spalte der Zeilen ist für Zweignummern reserviert. Sie zeigt die laufende Nummer des zugehörigen Zweigs — falls der Zweig nicht leer ist. Ein leerer Zweig wird durch eine leere Zelle dargestellt.
  • Links von der Tabellenansicht befinden sich:
    • ein Kontrollkästchen „Move associated branches" (bei der Erstellung eines neuen CASE-Elements nicht aktiviert) und
    • acht Funktionsschaltflächen, die nachfolgend beschrieben werden.
  • Der nächste Abschnitt darunter enthält:
    • ein Kontrollkästchen zum Aktivieren / Deaktivieren des Standardzweigs und
    • ein Textfeld für die Standardzweig-Beschriftung (nur bearbeitbar, wenn das Kontrollkästchen aktiviert ist).

Gebrochene Zeilen (durch einen Backslash am Ende einer Zeile, der die logische Fortsetzung in der nächsten Zeile symbolisiert, siehe letztes Beispiel in der obigen Tabelle) werden zu einer gemeinsamen Tabellenzeile zusammengefasst, wobei die „weichen Zeilenumbrüche" (d. h. die Backslashes) durch die Teilzeichenkette „\n" ersetzt erscheinen. Wenn Sie daher eine Zeile „weich umbrechen" möchten, fügen Sie die Zeichenfolge „\n" (ohne Anführungszeichen) an der gewünschten Position in der Zeile ein.

Editor-Beispiel mit einer weich gebrochenen Zeile
Editor-Beispiel mit einer weich gebrochenen Zeile

Die Wirkung der ersten vier Schaltflächen ist unkompliziert:

  • (Selektor-Zeile hinzufügen) Fügt am Ende der Tabelle eine neue Selektionszeile hinzu und öffnet den Zellen-Editor. Neue Zeilen haben stets eine leere Zelle in der ersten Spalte (kein zugehöriger Zweig). Ab Version 3.30-16 können Sie manuell einen verwaisten Zweig (falls vorhanden) zuordnen, indem Sie in die Zelle der ersten Spalte klicken und die entsprechende Zweignummer auswählen.
  • (Selektor-Zeilen löschen) Löscht die ausgewählten Zeilen.
  • (Selektor-Zeilen nach oben verschieben) Verschiebt die ausgewählten Zeilen eine Zeile nach oben.
  • (Selektor-Zeilen nach unten verschieben) Verschiebt die ausgewählten Zeilen eine Zeile nach unten.

Die anderen vier Schaltflächen bedürfen einer etwas ausführlicheren Erklärung:

  • (Selektor-Zeile zusammenführen) Führt die ausgewählten Zeilen zu einer zusammen (mit Komma als Trennzeichen zwischen den Selektorausdrücken) — nur aktiviert, wenn die ausgewählten Zeilen nicht verschiedenen nicht-leeren Zweigen zugeordnet sind.
  • (Selektor-Zeilen aufteilen) Teilt die ausgewählte Zeile in mehrere auf (eine pro aufgelisteten Selektorausdruck) — nur aktiviert, wenn eine einzelne Zeile mit mehr als einem durch Komma getrennten Selektor ausgewählt ist.
  • (Aufzählungsassistent) Aufzählungsassistent: Wird aktiviert, sobald der Diskriminatorausdruck als von einem Aufzählungstyp erkannt wird und einige Aufzählungswerte unter den Selektoren fehlen. Wenn gedrückt, werden Zeilen für alle fehlenden Aufzählungswerte hinzugefügt (unter dem symbolischen Namen). Außerdem werden vorkommende Ganzzahlcodes im Bereich des Aufzählungstyps durch die entsprechenden symbolischen Aufzählungsnamen ersetzt, und überflüssige Zeilen (die nur Werte angeben, die nicht Mitglied des Aufzählungstyps sind) werden entfernt — es sei denn, sie sind einem nicht-leeren Zweig zugeordnet. Die Aktion beinhaltet auch das Abwählen des Standardzweig-Kontrollkästchens.
    Aufzählungsassistent Demo – vor der Anwendung
    Aufzählungsassistent Demo – vor der Anwendung
    Aufzählungsassistent Demo – nach der Anwendung
    Aufzählungsassistent Demo – nach der Anwendung
    Voraussetzung für eine erfolgreiche Aufzählungstyp-Inferenz
    Voraussetzung für eine erfolgreiche Aufzählungstyp-Inferenz
  • (Konsistenzprüfungsanzeige) Konsistenzprüfung: Zeigt dynamisch den Analysestatus an und ermöglicht die Anzeige eines Problemberichts (beim Drücken der Schaltfläche). Die Farbe ändert sich je nach Befund:
    • Rot, wenn Konflikte zwischen Selektoren erkannt werden (d. h. ein Selektorwert erscheint zwei- oder mehrmals) oder wenn der Diskriminatorausdruck als ungeeignet erwiesen wird (d. h. er spezifiziert ein Array oder einen Record).
    • Orange, wenn nicht-leere Zweige verwaisen (beim Bestätigen zu löschen sind), wenn einige Selektoren nicht ausgewertet werden können oder — bei einem Aufzählungstyp — wenn Zeilen Selektoren enthalten, die keine Mitglieder des Aufzählungstyps sind.
    • Normal, wenn keines der oben genannten Probleme gefunden wurde.

Die möglichen Konsistenzproblemberichte haben folgende Form:

CASE-Editor-Konsistenzprüfungsbericht 1
CASE-Editor-Konsistenzprüfungsbericht 1
CASE-Editor-Konsistenzprüfungsbericht 2
CASE-Editor-Konsistenzprüfungsbericht 2
  • Auswahlwert eines strukturierten Typs: Nur die entsprechende Meldung: „A structured choice expression is unsuited!"
  • Selektorkonflikte: Jeder Konflikt wird durch eine Zeile symbolisiert, die mit dem Selektorausdruck (Zeichenfolge) beginnt, dann einem Doppelpunkt als Trennzeichen, gefolgt von der Liste der Zeilennummern seines Vorkommens.
  • Zweifelhafte Selektoren (nicht auswertbare Literale oder Ausdrücke): Eine vertikale Liste der Selektoren.
  • Fehlende Aufzählungswerte (und kein Standardzweig): Die Namen der fehlenden Aufzählungskonstanten werden in einer durch Komma getrennten Zeile angezeigt.
  • Redundante Zeilen (unwahrscheinliche Werte) bei einem Aufzählungstyp als Diskriminator: Für jede redundante Zeile werden Zeilennummer und Selektorzeileninhalt aufgelistet.
  • Verwaiste Zweige: Eine durch Komma getrennte Liste von Zweignummern, die keiner Zeile mehr zugeordnet sind.
Erkannte Code-Konflikte
Erkannte Code-Konflikte
Erkannte fehlende Werte und redundante Zeilen
Erkannte fehlende Werte und redundante Zeilen

Die Tabellenzellen der ersten Spalte (Zweignummern) sind ab Version 3.30-16 unter bestimmten Umständen bearbeitbar: In diesem Fall erhalten Sie eine Auswahlliste, die anbietet: eine leere Zeichenkette (wenn die Zelle eine Zweignummer enthält, würden Sie diese löschen und damit den Zweig lösen); die Nummern aller aktuell verwaisten Zweige; die bereits zugeordnete Zweignummer (falls vorhanden) dieser Zeile.

Hinweis: Alle hier beschriebenen Aktivitäten zum Lösen oder Neuzuordnen von Zweigen sind nur eine Art Vorauswahl und werden erst beim Bestätigen der Änderungen über die Schaltfläche „OK" wirksam. Wenn das Kontrollkästchen „Move associated branches" beim Bestätigen nicht aktiviert ist, werden keine der vorbereiteten Zweig-Neuordnungen in Kraft gesetzt — das Ergebnis wäre dann dasselbe, als hätten Sie mit dem traditionellen Editor gearbeitet.

Diese Editor-Variante kann (auch bedingt, d. h. nur für CASE-Elemente mit nicht-leeren Zweigen) aktiviert oder im Dialog Struktureinstellungen deaktiviert werden.

Hinweise

  1. Sie können ein CASE-Element in eine äquivalente Menge verschachtelter IF-Elemente zerlegen, indem Sie den Zauberstab (Transmutations-Symbol) auf das Element im Diagramm anwenden (nicht im CASE-Element-Editor!). Sie können diese Zerlegung rückgängig machen, aber Sie können verschachtelte Alternativen nicht in ein CASE-Element transmutieren.
  2. Eine Option in den Struktureinstellungen ermöglicht die Angabe, dass atomare oder eingeklappte Zweige in CASE-Elementen mit vielen Zweigen (d. h. die Zweiganzahl überschreitet den angegebenen Schwellenwert) gedreht werden, um die Breite zu reduzieren. Siehe Beispiele in der obigen Tabelle und in den Struktureinstellungen.