Não, não há diretrizes padrão
Mas existem algumas técnicas que podem tornar uma função com muitos parâmetros mais suportáveis.
Você pode usar um parâmetro list-if-args (args *) ou um parâmetro dictionary-of-args (kwargs **
)
Por exemplo, em 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')
Saídas:
args1
args2
somevar:value
someothervar:novalue
value
missing
Ou você pode usar a sintaxe de definição literal do objeto
Por exemplo, aqui está uma chamada jQuery JavaScript para iniciar uma solicitação AJAX GET:
$.ajax({
type: 'GET',
url: 'http://someurl.com/feed',
data: data,
success: success(),
error: error(),
complete: complete(),
dataType: 'jsonp'
});
Se você der uma olhada na classe ajax do jQuery, há muito (aproximadamente 30) mais propriedades que podem ser definidas; principalmente porque as comunicações ajax são muito complexas. Felizmente, a sintaxe literal do objeto facilita a vida.
O C # intellisense fornece documentação ativa de parâmetros, portanto não é incomum ver arranjos muito complexos de métodos sobrecarregados.
Linguagens tipadas dinamicamente como python / javascript não têm essa capacidade, por isso é muito mais comum ver argumentos de palavras-chave e definições literais de objetos.
Prefiro definições literais de objetos ( mesmo em C # ) para gerenciar métodos complexos, porque é possível ver explicitamente quais propriedades estão sendo definidas quando um objeto é instanciado. Você precisará trabalhar um pouco mais para lidar com argumentos padrão, mas, a longo prazo, seu código será muito mais legível. Com definições literais de objeto, você pode quebrar sua dependência da documentação para entender o que seu código está fazendo à primeira vista.
IMHO, métodos sobrecarregados são altamente superestimados.
Nota: Se eu me lembro direito, o controle de acesso somente leitura deve funcionar para construtores literais de objeto em C #. Eles funcionam essencialmente da mesma maneira que a configuração de propriedades no construtor.
Se você nunca escreveu nenhum código não trivial em uma linguagem baseada dinamicamente (python) e / ou funcional / protótipo em javaScript, sugiro experimentá-lo. Pode ser uma experiência esclarecedora.
Pode ser assustador primeiro interromper sua dependência de parâmetros para a abordagem completa da inicialização de função / método, mas você aprenderá a fazer muito mais com seu código sem precisar adicionar complexidade desnecessária.
Atualizar:
Eu provavelmente deveria ter fornecido exemplos para demonstrar o uso em uma linguagem estaticamente tipada, mas atualmente não estou pensando em um contexto estaticamente tipificado. Basicamente, tenho trabalhado muito em um contexto digitado dinamicamente para voltar subitamente.
O que eu não sei é objeto sintaxe de definição literal é completamente possível em linguagens de tipagem estática (pelo menos em C # e Java) porque eu usei antes. Nas linguagens de tipo estaticamente, elas são chamadas de 'Inicializadores de Objetos'. Aqui estão alguns links para mostrar seu uso em Java e C # .