Hoy recibí una revisión de código de un desarrollador sénior que preguntaba "Por cierto, ¿cuál es su objeción al envío de funciones mediante una declaración de cambio?" He leído en muchos lugares cómo bombear un argumento a través del cambio a métodos de llamada es una mala OOP, no tan extensible, etc. Sin embargo, realmente no puedo encontrar una respuesta definitiva para él. Me gustaría resolver esto por mí mismo de una vez por todas.
Aquí están nuestras sugerencias de código de la competencia (se usa php como ejemplo, pero puede aplicarse de manera más universal):
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));
}
}
Parte de su argumento fue: "(el método de cambio) tiene una forma mucho más limpia de manejar los casos predeterminados que la que tiene en el método mágico genérico __call ()".
No estoy de acuerdo con la limpieza y de hecho prefiero llamar, pero me gustaría escuchar lo que otros tienen que decir.
Argumentos que se me pueden ocurrir en apoyo del Oopesquema:
- Un poco más limpio en términos del código que tiene que escribir (menos, más fácil de leer, menos palabras clave para considerar)
- No todas las acciones se delegan a un solo método. No hay mucha diferencia en la ejecución aquí, pero al menos el texto está más compartimentado.
- En el mismo sentido, se puede agregar otro método en cualquier lugar de la clase en lugar de un lugar específico.
- Los métodos tienen espacios de nombres, lo cual es bueno.
- No se aplica aquí, pero considere un caso donde se
Switch::go()opera en un miembro en lugar de un parámetro. Tendría que cambiar el miembro primero, luego llamar al método. ParaOopque pueda llamar a los métodos de forma independiente en cualquier momento.
Argumentos que se me pueden ocurrir en apoyo del Switchesquema:
- En aras de la discusión, un método más limpio para tratar una solicitud predeterminada (desconocida)
- Parece menos mágico, lo que puede hacer que los desarrolladores desconocidos se sientan más cómodos
¿Alguien tiene algo que agregar para cualquier lado? Me gustaría tener una buena respuesta para él.
Ooppermite tener phpdoc para describir cada método, que algunos IDE pueden analizar (p. ej., NetBeans).