Hoy recibí una revisión del código de un desarrollador senior que preguntaba: "Por cierto, ¿cuál es tu objeción al envío de funciones a través de una declaración de cambio?" He leído en muchos lugares acerca de cómo impulsar un argumento a través del cambio a los métodos de llamada es un OOP malo, no es extensible, etc. Sin embargo, 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 (php se usa como ejemplo, pero se puede aplicar 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 que "(el método de cambio) tiene una forma mucho más limpia de manejar los casos predeterminados que el método 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 puedo encontrar para apoyar el esquema Oop
:
- Un poco más limpio en términos del código que debe escribir (menos, más fácil de leer, menos palabras clave a considerar)
- No todas las acciones delegadas a un solo método. No hay mucha diferencia en la ejecución aquí, pero al menos el texto está más compartimentado.
- En la misma línea, 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 nombre, lo cual es bueno.
- No se aplica aquí, pero considere un caso donde
Switch::go()
operó en un miembro en lugar de en un parámetro. Tendría que cambiar el miembro primero, luego llamar al método. ParaOop
puede llamar a los métodos de forma independiente en cualquier momento.
Argumentos que puedo encontrar para apoyar el esquema Switch
:
- En aras del argumento, un método más limpio para tratar una solicitud predeterminada (desconocida)
- Parece menos mágico, lo que podría hacer que los desarrolladores desconocidos se sientan más cómodos
¿Alguien tiene algo que agregar para cada lado? Me gustaría tener una buena respuesta para él.