¿Cómo encadenar correctamente las funciones sobrecargadas?

8

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é?

Poli
fuente
1
"nueva función se agrega" (que significa "nuevo parámetro") no parece más difícil en el primer ejemplo. Lo que es ligeramente más duro en el primer ejemplo está cayendo una opción (como para que el usuario debe especificar tanto ay bo 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.
CodeReview es para revisar el código real, ya que está presentando psuedocode no está en el tema allí.
Winston Ewert el

Respuestas:

6

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.

John Kraft
fuente
2

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?

palacsint
fuente
Ahrm, suponga un número arbitrario de métodos / parámetros.
Bobby
0

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.

Mike Nakis
fuente