De l'art de faire des else if avec un switch
By Geoffrey on Thursday 14 October 2004, 12:03 - Coding - Permalink
Desfois on a besoin de faire des else if, beaucoup. Personnellement, je trouve cette syntaxe peu pratique et peu lisible. Je lui preferre de loin un petit switch. Exemple: prenons le if suivant:
if ($foo) {
foo();
} else if ($bar) {
bar();
} else if ($foobar) {
foobar();
}
Ca marche, mais c'est pas très esthétique. Avec un switch ça donne:
switch (true) {
case $foo:
foo();
break;
case $bar:
bar();
break;
case $foobar:
foobar();
break;
}
Ok, c'est plus long à écrire, mais c'est quand même autrement plus lisible non ?
Pour ceux qui ne comprennent pas le principe, il est peut-être utile de revenir sur le principe du switch. La documentation nous informe que:
The switch statement is similar to a series of IF statements on the same expression.
Un switch classique (switch ($foo) { case 'bar': bar(); break; }) n'est donc rien d'autre qu'un if déguisé (if ($foo == 'bar') { bar(); }). On peut donc extrapoler et dire que switch effectue des if entre l'objet du switch ($foo) et l'objet des case ('bar'). Notre switch(true) de tout à l'heure peut donc s'interpréter comme un if (true == $foo), CQFD. A partir de là, il est possible de faire plein de choses avec un switch comme par exemple utiliser des fonctions dans les cases:
switch(true) {
case isset($foo):
do_something($foo);
break;
case isset($bar):
do_something_else();
break;
}
Bien sur, les exemples donnés ici sont triviaux, et il existe d'autres méthodes ((isset($foo) && do_something($foo)) || (isset($bar) && do_something_else($bar)); par exemple, mais il existe surement de meilleurs méthodes ;) pour traiter ces cas, mais ils montrent bien l'utilisation qu'on peut faire d'un switch.
Comments
Esthétiquement parlant... ouais... au niveau des performances, ca reste à vérifier
Certes. Cela dit, je ne pense pas que la différence soit excessive, et même si le switch est un poil plus lent que le if, le gain en lisibilité (et donc en maintenabilité) et à mon avis suffisant pour justifier l'utilisation de cette syntaxe :)
Lors d'une longue succession de IF...ELSEIF...ELSE..., il n'y a pas photo > switch reste la solution la plus pratique (si pas propre) et conviviale. L'utilisation des IF/ELSEIF/ELSE a profusion ont tendance à rendre le code moins lisible, donc moins compréhensible. Sans compter qu'un ajout et une correction sont plus aisées dans le cas d'un switch...
C'est marrant, je pensais que c'était une base élémentaire chez les développeurs de préférer SWITCH à IF/ELSEIF/ELSE. Apparement, cela ne semble pas le cas. Ce qui me ravi : chui moins bourrin que je le pensais ;)