No, no hay una directriz estándar.
Pero hay algunas técnicas que pueden hacer que una función con muchos parámetros sea más soportable.
Puede usar un parámetro list-if-args (args *) o un parámetro dictionary-of-args (kwargs **
)
Por ejemplo, en python:
// Example definition
def example_function(normalParam, args*, kwargs**):
for i in args:
print 'args' + i + ': ' + args[i]
for key in kwargs:
print 'keyword: %s: %s' % (key, kwargs[key])
somevar = kwargs.get('somevar','found')
missingvar = kwargs.get('somevar','missing')
print somevar
print missingvar
// Example usage
example_function('normal parameter', 'args1', args2,
somevar='value', missingvar='novalue')
Salidas:
args1
args2
somevar:value
someothervar:novalue
value
missing
O podría usar la sintaxis de definición literal de objeto
Por ejemplo, aquí hay una llamada jQuery de JavaScript para lanzar una solicitud AJAX GET:
$.ajax({
type: 'GET',
url: 'http://someurl.com/feed',
data: data,
success: success(),
error: error(),
complete: complete(),
dataType: 'jsonp'
});
Si echa un vistazo a la clase ajax de jQuery, hay muchas (aproximadamente 30) propiedades más que se pueden configurar; principalmente porque las comunicaciones ajax son muy complejas. Afortunadamente, la sintaxis literal del objeto facilita la vida.
C # intellisense proporciona documentación activa de parámetros, por lo que no es raro ver arreglos muy complejos de métodos sobrecargados.
Los lenguajes de tipo dinámico como python / javascript no tienen esa capacidad, por lo que es mucho más común ver argumentos de palabras clave y definiciones literales de objetos.
Prefiero definiciones literales de objeto ( incluso en C # ) para administrar métodos complejos porque puede ver explícitamente qué propiedades se establecen cuando se instancia un objeto. Tendrá que hacer un poco más de trabajo para manejar los argumentos predeterminados, pero a la larga su código será mucho más legible. Con las definiciones literales de objetos, puede romper su dependencia de la documentación para comprender lo que hace su código a primera vista.
En mi humilde opinión, los métodos sobrecargados están muy sobrevalorados.
Nota: si recuerdo correctamente, el control de acceso de solo lectura debería funcionar para los constructores literales de objetos en C #. Básicamente funcionan igual que establecer propiedades en el constructor.
Si nunca ha escrito ningún código no trivial en un lenguaje basado en javaScript de tipo dinámico (python) y / o funcional / prototipo, le recomiendo que lo pruebe. Puede ser una experiencia esclarecedora.
Puede ser aterrador primero romper su dependencia de los parámetros para el enfoque final de la inicialización de funciones / métodos, pero aprenderá a hacer mucho más con su código sin tener que agregar una complejidad innecesaria.
Actualizar:
Probablemente debería haber proporcionado ejemplos para demostrar el uso en un lenguaje de tipo estático, pero actualmente no estoy pensando en un contexto de tipo estático. Básicamente, he estado haciendo demasiado trabajo en un contexto de tipo dinámico para cambiar repentinamente.
Lo que sí sé es que la sintaxis de definición literal de objetos es completamente posible en lenguajes estáticamente tipados (al menos en C # y Java) porque los he usado antes. En lenguajes tipados estáticamente se llaman 'Inicializadores de objetos'. Aquí hay algunos enlaces para mostrar su uso en Java y C # .