J'ai reçu un examen du code d'un développeur senior aujourd'hui demandant "Au fait, quelle est votre objection à la répartition des fonctions par le biais d'une instruction switch?" J'ai lu à de nombreux endroits sur le fait que pomper un argument via des méthodes de basculement vers un appel est une mauvaise POO, pas aussi extensible, etc. Cependant, je ne peux pas vraiment trouver de réponse définitive pour lui. Je voudrais régler cela une fois pour toutes.
Voici nos suggestions de codes concurrents (php utilisé comme exemple, mais peut s'appliquer de manière plus universelle):
class Switch {
public function go($arg) {
switch ($arg) {
case "one":
echo "one\n";
break;
case "two":
echo "two\n";
break;
case "three":
echo "three\n";
break;
default:
throw new Exception("Unknown call: $arg");
break;
}
}
}
class Oop {
public function go_one() {
echo "one\n";
}
public function go_two() {
echo "two\n";
}
public function go_three() {
echo "three\n";
}
public function __call($_, $__) {
throw new Exception("Unknown call $_ with arguments: " . print_r($__, true));
}
}
Une partie de son argument était "Il (méthode switch) a une manière beaucoup plus propre de gérer les cas par défaut que ce que vous avez dans la méthode magique générique __call ()."
Je ne suis pas d'accord sur la propreté et préfère en fait appeler, mais j'aimerais entendre ce que les autres ont à dire.
Arguments que je peux trouver à l'appui du Oop
schéma:
- Un peu plus propre en termes de code que vous devez écrire (moins, plus facile à lire, moins de mots clés à considérer)
- Toutes les actions ne sont pas déléguées à une seule méthode. Pas beaucoup de différence d'exécution ici, mais au moins le texte est plus compartimenté.
- Dans le même esprit, une autre méthode peut être ajoutée n'importe où dans la classe au lieu d'un emplacement spécifique.
- Les méthodes sont à espace de noms, ce qui est bien.
- Ne s'applique pas ici, mais considérons un cas où
Switch::go()
opéré sur un membre plutôt qu'un paramètre. Vous devez d'abord changer le membre, puis appeler la méthode. CarOop
vous pouvez appeler les méthodes indépendamment à tout moment.
Arguments que je peux trouver à l'appui du Switch
schéma:
- Pour des raisons d'argument, une méthode plus propre pour traiter une demande par défaut (inconnue)
- Semble moins magique, ce qui pourrait rendre les développeurs peu familiers plus à l'aise
Quelqu'un a-t-il quelque chose à ajouter de chaque côté? J'aimerais avoir une bonne réponse pour lui.
Oop
permet d'avoir phpdoc pour décrire chaque méthode, qui peut être analysée par certains IDE (par exemple, NetBeans).