Sven Rautenberg: unelegantes switch

Beitrag lesen

Moin!

Dieser ist entweder - oder  - oder und da müssen eben leider diese dämlichen breaks mit rein.

Geht doch auch ohne.

function switchcontent ($key)

{
    switch ($key) {
      case 1:
          return printf('Key: %s', $key);
      case 2:
          return printf('Key: %s', $key);
      case 3:
          return printf('Key: %s', $key);
    }
}

switchcontent (isset($_GET['var']) ? $_GET['var'] : 1 );


>   
>   
>   
> Ich arbeite gerne mit Switch, wenn es sich gerade anbietet, selbst mit den Breaks. Im Fall des OP fänd ich einen switch-Block garnicht mal so verkehrt.  
  
Switch-Statements sollte man bestmöglich vermeiden, denn switch hat diverse Probleme - weniger technischer Natur, sondern vielmehr im Hinblick auf Fehleranfälligkeit und Code-Klarheit.  
  
1\. Die einfachen Switch-Anwendungen, so wie beispielsweise auch deine, kann man viel besser mit einer Lookup-Tabelle lösen. Die Lookup-Tabelle ist darüber hinaus auch einfacher nach extern zu bewegen und dort pflegbar, da sie effektiv nur ein Array ist, welches sowohl statisch im Code stehen kann, als auch in Extra-Dateien oder Datenbanken.  
  
2\. Switch-Code erhöht massiv die Komplexität des Codes. Pro case-Eintrag steigt z.B. die zyklomatische Komplexität um 1 - und schon bei Werten ab 10 wird angeraten, diese Komplexität zu verringern, ab 20 ist die Komplexität eigentlich unbeherrschbar geworden - man kann also in einer Funktion maximal 10 case-Abschnitte haben, und selbst dann sind ansonsten keinerlei weitere Verzweigungen erlaubt, um die Komplexität im erwünschten Rahmen zu halten. Komplexe Funktionen sind fehleranfällig!  
  
3\. Code-Klarheit: Bei switch kann man die Break-Anweisungen weglassen, damit die Programmausführung im nächsten Case weitergeht. Normal ist aber, dass das Break überall steht. Was ist jetzt, wenn das Break fehlt? Ist das absichtlich weggelassen worden, oder sollte man es hinzufügen? Vor allem: Was ist, wenn manche anderen Case-Statements das break ebenfalls manchmal haben, manchmal nicht? Man muss dann den Code untersuchen und verstehen, man kann nicht die Dauer-Regel anwenden, dass das Break immer dazugehört.  
  
4\. Wer es auf die Spitze treiben will, der schiebt die Bedingungsauswertung ins case hinein:  
~~~php
switch(true) {  
	case $x >= 4 || $ < 0:  
		echo $x;  
		break;  
	case ($y > 0 && $x < 100) || $y < 0:  
		echo $y;  
		break;  
	default:  
		echo '0';  
}  

Damit ist dann garantiert Ende der Verständlichkeit. Wenn dann noch ein Break fehlt...

Aber selbstverständlich ist Jedermann frei in der Entscheidung, mit welchen Programmierkonstrukten er sich das Leben schwer machen will... :)

- Sven Rautenberg