Suponiendo que tiene funciones que toman un número creciente de parámetros opcionales (y un pseudo lenguaje que no permite parámetros opcionales y un número arbitrario de parámetros) como este:
function doStuff(Param a)
function doStuff(Param a, Param b)
function doStuff(Param a, Param b, Param c)
¿Cuál es una buena manera de unificarlos en una sola llamada? Me imagino dos diseños:
Caer a través de todo:
function doStuff(Param a)
doStuff(a, defaultB)
function doStuff(Param a, Param b)
doStuff(a, b, defaultC)
function doStuff(Param a, Param b, Param c)
// magic goes here
- El lado positivo: no hay mucha duplicación de código, fácil cambio de un solo parámetro predeterminado.
- La desventaja: muchas llamadas a funciones pueden hacer que Stacktraces sea más difícil de leer o inútil.
O llame directamente a la función 'última':
function doStuff(Param a)
doStuff(a, defaultB, defaultC)
function doStuff(Param a, Param b)
doStuff(a, b, defaultC)
function doStuff(Param a, Param b, Param c)
// magic goes here
- La ventaja: no hay muchas llamadas a funciones, no se preocupe si se agrega una nueva función a la cadena.
- La desventaja: mucha duplicación de código, especialmente los valores predeterminados.
¿En qué no pensé?
design-patterns
Poli
fuente
fuente
a
yb
o ninguno), pero la primera todavía gana para reducir al mínimo la duplicación de errores. Por cierto, error tipográfico: la implementación de sobrecarga media debe ser idéntica entre los ejemplos.Respuestas:
Prefiero el primer método La posibilidad de valores predeterminados duplicados en todo el lugar puede reducir severamente la mantenibilidad. Encontré ese problema específico en la naturaleza, y fue una pesadilla.
fuente
La primera son solo dos líneas adicionales en un stacktrace que no es tanto. En Java, nunca he encontrado que los stacktraces sean difíciles de leer debido a nombres de métodos similares.
De todos modos, usar demasiados parámetros podría ser un mal olor de código: ¿Cuántos parámetros son demasiados?
fuente
Optaría por el segundo paradigma (llamando directamente a la "última" función). Esto está bien y no constituye una duplicación de código real, ya que no implica la manipulación de ningún tipo de estado.
También ayuda a darse cuenta de que lo que está haciendo al proporcionar múltiples sobrecargas es simplemente un truco para proporcionar la ilusión de parámetros opcionales. Una vez que lo ve de esta manera, se hace evidente que el "último" y solo el "último" método es el que se supone que debe hacer un trabajo real, por lo que cualquier delegación entre los últimos métodos no tiene sentido.
Personalmente, ya no tengo que preocuparme por este problema, porque estoy usando C #, que admite parámetros opcionales, lo que me evita tener que hacer trucos como estos para emularlos.
fuente