167 votos

¿Cuántos parámetros son demasiadas?

Las rutinas pueden tener parámetros, eso no es noticia. Se pueden definir los parámetros que necesite, pero muchos de ellos hará su rutina difícil de entender y de mantener.

Por supuesto, usted podría usar una variable estructurada como una solución temporal: poner todas esas variables en una sola estructura y pasar a la rutina. De hecho, el uso de estructuras para simplificar las listas de parámetros es una de las técnicas descritas por Steve McConnell en el Código Completo. Pero, como él dice:

Cuidado de los programadores de evitar la agrupación de datos más de lo que es lógicamente necesario.

Así que si tu rutina tiene demasiados parámetros o utilizar una estructura para disimular una gran lista de parámetros, probablemente lo estés haciendo algo mal. Es decir, no estás mantener el acoplamiento suelto.

Mi pregunta es, ¿cuándo puedo considerar un parámetro de la lista demasiado grande? Creo que más de 5 parámetros, son demasiados. ¿Qué te parece?

124voto

Nick Puntos 4676

Cuando es algo que se considera tan obsceno como algo que puede ser regulado a pesar de la 1ª Enmienda de la garantía a la libertad de expresión? Según el juez Potter Stewart, "yo sé que cuando lo vea." Lo mismo se aplica aquí.

No me gusta hacer reglas duras y rápidas como ésta, porque la respuesta de los cambios, no sólo en función del tamaño y el alcance de su proyecto, pero creo que los cambios, incluso hasta el nivel de módulo. Dependiendo de lo que su método está haciendo, o lo que la clase se supone que representa, es muy posible que en 2 argumentos son muchos y es un síntoma de exceso de acoplamiento.

Yo diría que por hacer la pregunta en primer lugar, y calificar tu pregunta todo lo que hice, que los que realmente saben de esto. La mejor solución es no depender de un duro y rápido número, pero en lugar de mirar hacia el diseño de reseñas y revisiones de código entre sus pares para identificar áreas en las que tienen una baja cohesión y acoplamiento.

Nunca tengan miedo de mostrar sus compañeros su trabajo. Si usted tiene miedo, que es probablemente la más grande señal de que algo está mal con su código, y que usted ya lo sabe.

88voto

Skizz Puntos 30682

Una función sólo puede tener demasiados parámetros, si algunos de los parámetros son redundantes. Si todos los parámetros que se utilizan, la función debe tener el número correcto de parámetros. Tome esto a menudo se utiliza la función:

HWND CreateWindowEx
(
  DWORD dwExStyle,
  LPCTSTR lpClassName,
  LPCTSTR lpWindowName,
  DWORD dwStyle,
  int x,
  int y,
  int nWidth,
  int nHeight,
  HWND hWndParent,
  HMENU hMenu,
  HINSTANCE hInstance,
  LPVOID lpParam
);

Que de las 12 parámetros (9 si boundle la x,y,w y h como un rectángulo) y también los parámetros derivados de la clase nombre. ¿Cómo reducir esta? Queremos reducir el número más hasta el punto?

No dejes que el número de parámetros que molesta, sólo asegúrese de que es lógico y está bien documentado y dejar intellisense* ayudarle.

  • Otros códigos asistentes están disponibles!

73voto

Patrick McElhaney Puntos 22093

En Código Clean , Robert C. Martin dedicó cuatro páginas al tema. Aquí está el quid:

El número ideal de argumentos para una función es igual a cero (niládica). Luego viene una (monádico), seguido de cerca por dos (diádica). Tres argumentos (triádicas) deben evitarse siempre que sea posible. Más de tres (poliádica) requiere una justificación muy especial - y luego no se debe utilizar de todos modos.

66voto

Jeffrey L Whitledge Puntos 27574

Parte del código que he trabajado en los últimos variables globales usadas sólo para evitar que pasa demasiados parámetros alrededor.

Por favor, no hagas eso!

(Por lo general.)

21voto

Auron Puntos 2123

Muchas gracias por todas tus respuestas:

  • Fue un poco sorprendente encontrar personas que también piensan (como yo) que 5 de los parámetros es un buen límite de la cordura del código.

  • En general, las personas tienden a estar de acuerdo que un límite entre el 3 y el 4 es buena regla del pulgar. Esto es razonable ya que la gente suele tener un mal momento cuenta con más de 4 cosas.

  • Como Milán puntos, en promedio, las personas pueden mantener más o menos 7 cosas en su cabeza en un tiempo. Pero creo que no se puede olvidar que, a la hora de diseñar/mantenimiento/estudiar una rutina, hay que tener en cuenta más cosas que sólo los parámetros.

  • Algunas personas consideran que una rutina debe tener tantos argumentos como necesita. Estoy de acuerdo, pero sólo para algunos casos específicos (llamadas a OS Api, rutinas, donde la optimización es importante, etc.). Que me sugieren para ocultar la complejidad de estas rutinas mediante la adición de una capa de abstracción justo encima de estas llamadas siempre que sea posible.

  • Nick tiene algunos pensamientos interesantes sobre esto. Si no quieren leer sus comentarios, que resumo para ustedes: en pocas palabras, depende de:

    No me gusta hacer reglas duras y rápidas como ésta, porque la respuesta de los cambios, no sólo en función del tamaño y el alcance de su proyecto, pero creo que los cambios, incluso hasta el nivel de módulo. Dependiendo de lo que su método está haciendo, o lo que la clase se supone que representa, es muy posible que en 2 argumentos son muchos y es un síntoma de exceso de acoplamiento.

    La moraleja aquí es que no hay que tener miedo de mostrar su código a sus compañeros, a discutir con ellos y tratar de "identificar áreas en las que tienen una baja cohesión y acoplamiento".

  • Por último, creo que wnoise mucho está de acuerdo con Nick, y concluye su satírica contribución con esta visión poética (ver comentario abajo) de el arte de la programación:

    La programación no es ingeniería. Organización de código es un arte, ya que depende de factores humanos, que dependen demasiado de contexto para cualquier regla.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X