Les switch
déclarations et le polymorphisme ont tous deux leur utilité. Notez cependant qu'une troisième option existe également (dans les langages qui prennent en charge les pointeurs de fonction / lambdas et les fonctions d'ordre supérieur): mapper les identificateurs en question aux fonctions de gestionnaire. Ceci est disponible par exemple en C qui n'est pas un langage OO, et C # qui est *, mais pas (encore) en Java qui est aussi OO *.
Dans certains langages procéduraux (n'ayant ni polymorphisme ni fonctions d'ordre supérieur) switch
/ les if-else
déclarations étaient le seul moyen de résoudre une classe de problèmes. De nombreux développeurs, habitués à cette façon de penser, ont continué à utiliser switch
même dans les langages OO, où le polymorphisme est souvent une meilleure solution. C'est pourquoi il est souvent recommandé d'éviter les switch
déclarations / refactor en faveur du polymorphisme.
Quoi qu'il en soit, la meilleure solution dépend toujours de la casse. La question est: quelle option vous donne un code plus propre, plus concis et plus facile à gérer à long terme?
Les instructions de commutation peuvent souvent devenir lourdes, avec des dizaines de cas, ce qui rend leur maintenance difficile. Comme vous devez les conserver dans une seule fonction, cette fonction peut devenir énorme. Si tel est le cas, vous devriez envisager une refactorisation vers une solution basée sur une carte et / ou polymorphe.
Si le même switch
commence à apparaître à plusieurs endroits, le polymorphisme est probablement la meilleure option pour unifier tous ces cas et simplifier le code. Surtout si d'autres cas devraient être ajoutés à l'avenir; plus vous avez besoin de mises à jour à chaque fois, plus il y a de possibilités d'erreurs. Cependant, souvent les gestionnaires de cas individuels sont si simples, ou il y en a tellement, ou ils sont tellement interdépendants, que les refactoriser dans une hiérarchie de classes polymorphes complète est exagéré, ou entraîne beaucoup de code dupliqué et / ou emmêlé, difficile de maintenir la hiérarchie des classes. Dans ce cas, il peut être plus simple d'utiliser à la place des fonctions / lambdas (si votre langue le permet).
Cependant, si vous en avez un switch
dans un seul endroit, avec seulement quelques cas faisant quelque chose de simple, ce pourrait bien être la meilleure solution pour le laisser tel quel.
* J'utilise le terme "OO" de manière lâche ici; Je ne suis pas intéressé par les débats conceptuels sur ce qui est «réel» ou «pur» OO.