Programmierung4 - VertiefungFallunterscheidungen (switch)

Fallunterscheidungen (switch)

💡

Dauer: 30 Minuten

  • switch als Alternative zu if/else if/else

Ziel: Es gibt oft mehrere Konzepte der Programmierung, die für eine Lösung geeignet sind

Es gibt Situationen, in denen mehrere Fälle unterschieden werden müssen. Mit if … else if … else … kann dies recht unübersichtlich werden:

let a = 13, b = 4;	
let op = prompt("Welche Rechenoperation?");
if(op === "+") {
  console.log(a + b);
} else if(op === "-") {
  console.log(a - b);
} else if(op === "*") {
  console.log(a * b);
} else if(op === "/") {
  console.log(a / b);
} else if(op === "%") {
  console.log(a % b);
} else {
  console.log(`Operator ${op} nicht unterstützt`);
}

In solchen Situation stellt switch gelegentlich eine besser lesbare Alternative dar:

let a = 13, b = 4;	
let op = prompt("Welche Rechenoperation?");
switch(op) {
  case "+":
    console.log(a + b);
    break;
  case "-":
    console.log(a - b);
    break;
  case "*":
    console.log(a * b);
    break;
  case "/":
    console.log(a / b);
    break;
  case "%":
    console.log(a % b);
    break;
  default:
    console.log(`Operator ${op} nicht unterstützt`);
}

Der Code ist insgesamt etwa gleich lang und ergibt hier in beiden Beispielen dasselbe Ergebnis. Dennoch finden manche, dass switch oft klarer strukturiert ist als verschachtelte if/else if/else-Ausdrücke. Dadurch entsteht durch switch gelegentlich Code, der einfacher zu lesen ist als ein Ansatz mit if/else if/else.

Bemerkungen

Grundsätzlich lassen sich alle Verzweigungen und Fallunterscheidungen mit if/else if/else ausdrücken.
switch stellt lediglich eine Alternative dar, die in manchen Situationen nützlich sein kann.

switch gibt es in einigen Programmiersprachen.

Mit switch sehen wir ein Beispiel dafür, dass es in Programmiersprachen oftmals mehrere Möglichkeiten gibt, etwas in Code auszudrücken.

Die Syntax eines switch-Ausdrucks sieht im Allgemeinen so aus:

switch( ...Auswahlausdruck... ) {
  case Auswahlkonstante:
    // Anweisung
    // ⋮
    // Anweisung
    break;
  case Auswahlkonstante:
    // Anweisung
    // ⋮
    // Anweisung
    break;
  // ⋮
  default:
    // Anweisung
    // ⋮
    // Anweisung
    break;
}

Der Auswahlausdruck zu Beginn des switch wird oft durch den Inhalt einer Variablen vorgegeben.

Für die Auswahlkonstanten in den case-Teilen wird dann ein konkreter Wert für die im switch angegebene Variable abgefragt. Hier wird ein Test auf Gleichheit durchgeführt, allerdings ohne den Vergleich hinzuschreiben.

Der Auswahlausdruck wird ausgewertet, sein Wert wird unter den vorhandenen Auswahlkonstanten gesucht. Die Anweisungen unmittelbar nach der entsprechenden Auswahlkonstante werden bis zum nächsten break ausgeführt.

Die Anweisungen werden fortlaufend ausgewertet („fall-through“)!

Daher Vorsicht: break nicht vergessen!

Es können ein oder mehrere case-Blöcke angegeben werden. Es kann höchstens einen default Block geben (analog zu else in Verzweigungen), der aktiv wird, wenn keine der Auswahlkonstanten dem Auswahlausdruck gleicht.

Ein switch funktioniert nur in bestimmten Situationen, nämlich wenn für einen Ausdruck bzw. eine Variable nur die Gleichheit überprüft wird.

Beispiele in replit.com zeigen, damit switch in verschiedenen Situation nachvollzogen werden kann (case zusammenfassen, break, „fall-through“, usw.).

switch als Alternative zu if/else if/else

Jede Verzweigung mit if kann im Prinzip durch ein switch ersetzt werden. Dazu kann zunächst ein switch mit dem „Auswahlausdruck“ true deklariert werden:

switch(true) {
  // case...usw.
}

Nun lassen sich in den case-Teilen beliebige logische bzw. boolesche Ausdrücke verwenden:

const age = prompt("Bitte Alter eingeben:");
 
switch(true) {
  case age > 0 && age < 18:
    console.log("minderjährig");
    break;
  case age >= 18 && age < 67:
    console.log("erwachsen");
    break;
  case age >= 67 && age < 120:
    console.log("im Ruhestand");
    break;
  default:
    console.log("Ungültiges Alter: " + age);
    break;
}

Hier wird sozusagen jeder case-Ausdruck mit true verglichen, sodass hierdurch beliebige Verzweigungen (if/else if/else) auch mit switch ausgedrückt werden können.