Como se indica en el título, ¿son útiles los parámetros opcionales, como los utilizados en C #, o son un obstáculo para el mantenimiento de la aplicación y deben evitarse ya que pueden dificultar la comprensión del código?
14
Como se indica en el título, ¿son útiles los parámetros opcionales, como los utilizados en C #, o son un obstáculo para el mantenimiento de la aplicación y deben evitarse ya que pueden dificultar la comprensión del código?
Respuestas:
Los parámetros opcionales, en mi experiencia, han sido algo bueno. Nunca los he encontrado confusos (al menos no más confusos que la función real), ya que siempre puedo obtener los valores predeterminados y saber cómo se llama.
Un uso para ellos es cuando tengo que agregar otro parámetro a una función que ya está en uso general, o al menos en la interfaz pública. Sin ellos, tendría que rehacer la función original para llamar a una que tenga otro argumento, y eso puede volverse realmente viejo si termino agregando argumentos más de una vez.
fuente
new Circle(size, color, filled, ellipseProportions)
dóndesize
ycolor
se requieren y el resto son predeterminados.En general, si necesita muchos parámetros / opcionales con frecuencia, sus funciones están haciendo demasiado y deben dividirse. Es probable que esté rompiendo el SRP (Principio de responsabilidad única).
Busque los parámetros que se pueden agrupar, por ejemplo (x e y, se convierten en un punto).
¿Son estos parámetros opcionales indicadores con un valor predeterminado? Si usa banderas, la función debe dividirse.
Eso no quiere decir que nunca debe tener parámetros opcionales, pero en general, más de uno o dos parámetros sugieren un olor a código.
También podría ser una pista de que la función, en realidad, debería ser una clase, con los parámetros opcionales cambiados a propiedades, y los parámetros necesarios forman parte del constructor.
fuente
Los parámetros opcionales están bien
Por lo general, la justificación es que a) sabes que tienes muchos argumentos posibles para tu método, pero no quieres sobrecargarlo por miedo a agrupar tu API, o b) cuando no conoces todos los argumentos posibles pero no quiere obligar a su usuario a proporcionar una matriz. En cada caso, los parámetros opcionales vienen al rescate de una manera ordenada y elegante.
Aquí hay unos ejemplos:
1. Desea evitar la sobrecarga y no desea especificar una matriz
Eche un vistazo a printf () de C, Perl, Java, etc. Es un gran ejemplo del poder de los parámetros opcionales.
Por ejemplo:
Sin sobrecarga, sin matrices, simple e intuitivo (una vez que haya captado los códigos de formato de cadena estándar). Algunos IDEs incluso le dirán si su cadena de formato no coincide con sus parámetros opcionales.
2. Desea permitir el uso de valores predeterminados y mantenerlos ocultos para el usuario del método.
sendEmail ("[email protected]");
El método sendEmail detecta que faltan varios valores esenciales y los completa utilizando valores predeterminados definidos (asunto, cuerpo, cc, bcc, etc.). La API se mantiene limpia, pero flexible.
Una nota sobre demasiados parámetros
Sin embargo, como han dicho otros, tener demasiados parámetros obligatorios para un método indica que probablemente tenga algo mal con su diseño. Esto es particularmente cierto si comparten el mismo tipo, ya que el desarrollador puede cambiarlos por accidente y dar lugar a resultados extraños en tiempo de ejecución:
es un candidato ideal para la refactorización del objeto Introducir parámetro para crear
Esto a su vez puede conducir a un mejor diseño basado en un patrón Factory con una especificación proporcionada como objeto de parámetro.
fuente
Uno de los problemas con los parámetros predeterminados en C # (estoy pensando que DoSomething nulo (int x = 1)) es que son constantes. Eso significa que si cambia el valor predeterminado, tendrá que volver a compilar cualquier consumidor de esa llamada al método. Si bien esto es bastante fácil de hacer, hay ocasiones en que esto es peligroso.
fuente
Depende de lo que esté haciendo tu código. Si hay valores predeterminados razonables, debe usar parámetros opcionales, pero si no hay valores predeterminados razonables, agregar parámetros opcionales hará que su código sea más complicado. En muchos casos, los parámetros opcionales son una forma ordenada de eludir las comprobaciones nulas y eliminar la lógica de ramificación. Javascript no tiene parámetros opcionales, pero hay una manera de emularlos con || (lógico o) y lo uso todo el tiempo cuando hago cosas relacionadas con la base de datos porque si el usuario no proporciona algún valor, entonces sustituyo mis propios valores con la ayuda de || lo que me ahorra la molestia de escribir un montón de declaraciones if if.
fuente
Los parámetros opcionales son una excelente manera de hacer que las cosas simples sean simples y que las cosas complicadas sean posibles simultáneamente. Si hay un valor predeterminado razonable razonable que la mayoría de los usuarios querrán, al menos en casos de uso rápido y sucio, entonces no deberían tener que escribir repeticiones para especificarlo manualmente cada vez que llaman a su función. Por otro lado, si las personas pueden tener una buena razón para querer cambiarlo, entonces debe exponerse.
Usar una clase es, en mi humilde opinión, una solución terrible, ya que es detallado, ineficiente e inconsistente con el modelo mental típico de lo que hace una clase. Una función es la abstracción perfecta para un verbo, es decir, hacer algo y regresar. Una clase es la abstracción correcta para un sustantivo, es decir, algo que tiene estado y puede manipularse de varias maneras. Si el primero debe ser el modelo mental del usuario API, entonces no lo convierta en una clase.
fuente
El problema con los argumentos opcionales es que las personas tienden a meter más y más (y más) argumentos en la función en lugar de extraer código relevante en una nueva función. Esto se lleva al extremo en php . Por ejemplo:
fuente
Los parámetros opcionales son básicamente una forma diferente de sobrecargar una función. ¿Entonces esto básicamente se reduce a: "está sobrecargando una función incorrecta"?
fuente
Inicialmente me encantó esta característica en Python, y la usé para 'extender' los métodos ya utilizados. Y se veía agradable y fácil, pero retrocedió pronto; porque cuando agregué un parámetro opcional, esto estaba modificando el comportamiento de un método existente en el que confiaba el antiguo cliente y de una manera que no fue captada por los casos de prueba de unidad existentes. Básicamente, hacer esto es romper el Principio Abierto Cerrado; el código está abierto para extensión pero cerrado para modificación. Así que creo que usar esta función para modificar el código existente no es una buena idea; pero está bien si se usa desde el principio
fuente
Creo que sería mejor sobrecargar una función con firmas diferentes (es decir, parámetros) que usar parámetros opcionales.
fuente