Element umwandeln (Transmute)
Ăberblick
Die Funktion zum Umwandeln (Transmutieren) von Elementen oder Elementfolgen in Elemente eines anderen Typs kann die Bearbeitung von Nassi-Shneiderman-Diagrammen erheblich erleichtern. Dies ist besonders hilfreich, um z. B. einen Unterprogrammaufruf oder einen EXIT fĂŒr den Executor funktionstĂŒchtig zu machen, oder um mehrere Anweisungen zusammenzufĂŒhren bzw. aufzuteilen â zur Verbesserung des Diagramm-Layouts oder um das Setzen von Haltepunkten zwischen Anweisungen zu ermöglichen, die zuvor ein gemeinsames Instruction-Element bildeten.
Umgewandelt werden können: unstrukturierte (einfache) Elemente (Instructions (Anweisungen), CALLs (Aufrufe) oder EXITs (SprĂŒnge)), Folgen einfacher Elemente, zĂ€hlende FOR-Schleifen, CASE- und IF-Elemente. Einfache Elemente mit einer einzigen Zeile können ihren Typ wechseln. Einfache Elemente mit mehreren Zeilen werden aufgeteilt; eine Folge einfacher Elemente wird zusammengefĂŒhrt. Beim ZusammenfĂŒhren wird der Elementtyp nur dann beibehalten, wenn alle Elemente denselben Typ haben; andernfalls wird das Ergebnis zu einer mehrzeiligen Instruction âherabgestuft". Eine FOR-Schleife oder ein CASE-Element wird zerlegt (siehe unten).
Um eine Umwandlung des ausgewÀhlten Elements oder der ausgewÀhlten Teilfolge einzuleiten, können Sie:
- die entsprechende SchaltflĂ€che drĂŒcken;
- den MenĂŒeintrag "Transmute" (Umwandeln) im MenĂŒ "Diagram" (Diagramm) oder im KontextmenĂŒ aktivieren;
- die Tastenkombination
<Ctrl><T>drĂŒcken.
Diese Steuerelemente sind nur aktiviert, wenn eine geeignete Auswahl vorhanden ist (siehe unten).
Die folgende Tabelle listet die verfĂŒgbaren Umwandlungen je nach aktueller Auswahl auf:
Mögliche Umwandlungen
| Auswahl | Zeilen | Voraussetzungen | Ergebnis |
|---|---|---|---|
| einzelnes Instruction-Element (Anweisung) | 1 | CALL-Syntax | CALL-Element (gleicher Inhalt) |
| einzelnes Instruction-Element | 1 | Jump (EXIT)-Syntax | EXIT-Element (gleicher Inhalt) |
| einzelnes Instruction-Element | ≥ 2 | â | Folge einzeiliger Instruction-Elemente (Aufteilen) |
| einzelnes CALL-Element | 1 | â | Instruction-Element (gleicher Inhalt) |
| einzelnes CALL-Element | ≥ 2 | â | Folge einzeiliger CALL-Elemente (Aufteilen) |
| einzelnes EXIT-Element | 1 | â | Instruction-Element (gleicher Inhalt) |
| einzelnes EXIT-Element | ≥ 2 | â | Folge einzeiliger EXIT-Elemente (Aufteilen) |
| Folge von Instruction-Elementen | â | â | Mehrzeiliges Instruction-Element (zusammengefĂŒhrt) |
| Folge von CALL-Elementen | â | â | Mehrzeiliges CALL-Element (nicht ausfĂŒhrbar!) |
| Folge von EXIT-Elementen | â | â | Mehrzeiliges EXIT-Element (nicht ausfĂŒhrbar!) |
| Gemischte Folge aus Instruction-, CALL- oder EXIT-Elementen | â | â | Mehrzeiliges Instruction-Element |
| FOR-Schleife | â | ZĂ€hlende Variante | WHILE-Schleife mit Hilfsanweisungen |
| CASE-Element | â | â | Verschachtelte IF-Elemente (ggf. mit Hilfszuweisung) |
| IF-Element (Alternative) | â | Nicht-leerer FALSE-Zweig | IF-Element mit vertauschten Zweigen und negierter Bedingung |
Alle Umwandlungen können rĂŒckgĂ€ngig gemacht und wiederhergestellt werden. FĂŒr einige Umwandlungen gibt es sogar eine Umkehroperation, jedoch nicht fĂŒr alle.
Beispiele
Wie die folgenden Abbildungen zeigen, genĂŒgt ein einziger Klick auf die Umwandlungs-SchaltflĂ€che, um ein mehrzeiliges Instruction-Element in eine Folge von Anweisungen aufzuteilen (und umgekehrt).


Ist das zweite Element der Aufteilergebnis-Folge ausgewĂ€hlt, wĂŒrde eine nachfolgende Umwandlung die Anweisung in ein CALL-Element konvertieren, da es den syntaktischen Anforderungen eines ausfĂŒhrbaren Unterprogrammaufrufs entspricht (siehe auch Executor).


Die Umwandlung einer FOR-Schleife (in der âzĂ€hlenden" Variante) zerlegt sie in eine WHILE-Schleife mit einer separaten Initialisierungsanweisung und einer eingebetteten Inkrement-/Dekrement-Anweisung. Diese Operation ist besonders sinnvoll, wenn eine zusĂ€tzliche Bedingung zur Steuerung der Schleife benötigt wird â und natĂŒrlich auch, um die Ăquivalenz beider Konstrukte zu demonstrieren.
War die zerlegte FOR-Schleife eingefÀrbt, erben alle ersetzenden Elemente dieselbe Farbe.
Hinweis: Es gibt keine Umkehroperation fĂŒr die Zerlegung einer FOR-Schleife (sie ist nur wĂ€hrend der aktuellen Sitzung per RĂŒckgĂ€ngig rĂŒcknehmbar). FĂŒr traversierende FOR-Schleifen (auch FOR-IN-Schleifen genannt) steht derzeit keine Umwandlung zur VerfĂŒgung.


Die Umwandlung einer CASE-Struktur zerlegt sie in eine Ă€quivalente Menge verschachtelter IF-Anweisungen. Ist der Diskriminator kein Variablenname, sondern ein zu berechnender Ausdruck, wird vor der Ă€uĂeren ersetzenden IF-Anweisung eine Anweisung eingefĂŒgt, die seinen Wert einer generisch benannten Variable zuweist. So wird eine wiederholte Berechnung des Diskriminatorwerts vermieden, was nicht nur die Leistung, sondern auch die Konsistenz sichert. Eine solche Zerlegung kann sinnvoll sein, wenn Vergleiche mit nicht-konstanten Werten (die eine CASE-Struktur erfordert) oder gegen Intervalle benötigt werden.
War das zerlegte CASE-Element eingefÀrbt, erben alle ersetzenden Elemente dieselbe Farbe.


Auch hier gibt es keine Umkehroperation: Verschachtelte oder verkettete IF-Elemente können nicht automatisch zu einem CASE-Element zusammengesetzt werden.
Eine IF-Anweisung (Alternative) mit einer unglĂŒcklich formulierten Bedingung (z. B. so, dass der TRUE-Zweig leer bliebe â was nicht erlaubt ist) kann leicht gespiegelt werden, vorausgesetzt, der ELSE-Zweig war nicht leer (ein leerer TRUE-Zweig wĂŒrde ein unzulĂ€ssiges IF-Element ergeben):


In der aktuellen Version von Structorizer ist die Negation der Bedingung nicht besonders intelligent (wie im Beispiel zu sehen, wĂ€re n≥2 ein eleganteres Ergebnis gewesen), aber zumindest fĂŒhrt ein wiederholtes Spiegeln nicht dazu, dass der Ausdruck mit immer mehr verschachtelten not-Operatoren aufgeblĂ€ht wird. (Eine spĂ€tere Version könnte die logische Invertierung verbessern.)
Umgang mit Kommentaren beim ZusammenfĂŒhren, Aufteilen und Zerlegen
Beim ZusammenfĂŒhren von Anweisungen versucht der Umwandlungsmechanismus, die Kommentare der kombinierten Elemente so zu verketten, dass der resultierende mehrzeilige Kommentar beim Aufteilen wieder korrekt den ursprĂŒnglichen Instruction-Elementen zugeordnet werden kann. Dieses BemĂŒhen kann jedoch in folgenden FĂ€llen scheitern:
- Das resultierende mehrzeilige Element wird manuell bearbeitet;
- Das resultierende mehrzeilige Element wird mit weiteren Anweisungen zusammengefĂŒhrt.
Ist eine eindeutige Neuverteilung der Kommentarzeilen beim Aufteilen nicht möglich, erhÀlt das erste der getrennten Elemente den gesamten Kommentar, wÀhrend die folgenden Elemente mit einem leeren Kommentar enden.
Der Kommentar einer zerlegten FOR-Schleife wird auf die ersetzende WHILE-Schleife ĂŒbertragen. Die beiden erzeugten Hilfs-Instruction-Elemente erhalten keine Kommentare.
Der Kommentar eines zerlegten CASE-Elements wird vom ersten der ersetzenden Elemente geerbt, d. h. entweder von der Diskriminator-Zuweisung (sofern eingefĂŒgt) oder von der Ă€uĂersten IF-Anweisung.