Há muito tempo, eu programava muito no ADA, e era normal nomear argumentos ao invocar uma função - SomeObject.DoSomething (SomeParameterName => someValue);
Agora que o C # suporta argumentos nomeados, estou pensando em voltar a esse hábito em situações em que talvez não seja óbvio o que um argumento significa.
Você pode argumentar que sempre deve ser óbvio o que um argumento significa, mas se você tiver um argumento booleano e os chamadores estiverem passando em "verdadeiro" ou "falso", qualificar o valor com o nome torna o site da chamada mais legível.
contentFetcher.DownloadNote (nota, manual: true);
Eu acho que eu poderia criar enums em vez de usar verdadeiro ou falso (manual, automático neste caso).
O que você pensa ocasionalmente usando argumentos nomeados para facilitar a leitura do código?
fonte
Respostas:
Isso foi sugerido no desenvolvimento do C ++, e Stroustrup discute isso em seu "Design e evolução do C ++", páginas 153 e seguintes. A proposta foi bem elaborada e baseou-se em experiências anteriores com a Ada. Não foi adotado.
O maior motivo foi que ninguém queria incentivar funções com um grande número de parâmetros. Cada recurso adicional em um idioma custa algo e não havia desejo de adicionar um recurso para facilitar a gravação de programas ruins.
Também levantou questões sobre quais eram os nomes de parâmetros canônicos, particularmente na convenção usual de cabeçalho e arquivo de código. Algumas organizações tinham nomes de parâmetro mais longos e mais descritivos no arquivo .h, e nomes mais curtos e fáceis de digitar no arquivo .cpp (sufixos de arquivo substitutos, conforme desejado). Exigir que esses sejam os mesmos seria um custo adicional na compilação, e a mistura de nomes entre os arquivos de origem pode causar erros sutis.
Também pode ser manipulado usando objetos em vez de chamadas de função. Em vez de uma chamada GetWindow com uma dúzia de parâmetros, crie uma classe Window com uma dúzia de variáveis privadas e adicione setters conforme necessário. Ao encadear os levantadores, é possível escrever algo parecido
my_window.SetColor(green).SetBorder(true).SetBorderSize(3);
. Também é possível ter funções diferentes com padrões diferentes que chamam a função que realmente faz o trabalho.Se você está preocupado apenas com o efeito da documentação
contentFetcher.DownloadNote(note, manual : true);
, sempre pode escrever algo comocontentFetcher.DownloadNote(note, /* manual */ true);
, portanto, isso não ajuda muito na documentação.fonte
Eu acho que isso é questão de tornar o código incorreto mais legível, em vez de "melhores práticas".
Ter um método (ou contratado) que aceite 20 parâmetros é um "mau cheiro" e provavelmente deve-se a um problema no seu projeto. No entanto, se eu sou forçado a trabalhar no código quando os métodos usam muitos parâmetros, o parâmetro nomeado torna o código menos difícil de entender.
Quando os métodos possuem apenas 1 ou 2 parâmetros e, a partir do nome do método, fica claro qual é o parâmetro, o parâmetro nomeado não adiciona nada. Este é o caso ideal para se estar.
Se todo o código no qual você trabalha for escrito como o livro " código limpo ", você terá muito pouco uso para parâmetros nomeados, no entanto, vivemos no mundo real.
fonte
void TrackDataChange(Data oldData, Data newData)
Concordo que adicionar o nome do parâmetro o torna mais legível. No entanto, a maioria dos livros que li parece considerar as opções booleanas uma prática ruim. Às vezes faço isso:
Isso oferece mais flexibilidade ao implementar sua API. Também permite controlar o caso em que você tem várias opções booleanas, mas nem todas elas podem estar ativas ao mesmo tempo.
fonte
Eu acredito muito em parâmetros nomeados em situações em que os tipos e semânticas não são claros no nome do método. Minha experiência é que poucas pessoas leem a documentação.
Dito isto, os parâmetros nomeados não devem ser uma alternativa para criar listas de argumentos sensatas, usar objetos auxiliares (para "unir" argumentos semanticamente relacionados) e usar enumerações quando relevante.
fonte
Eu acho que isso é mais útil em linguagens não OO, onde você pode ter uma função que precisa fazer algo de várias maneiras ligeiramente diferentes, e a maneira como ela determina o que fazer é baseada nos valores dos parâmetros. No mundo OOP, sobrecarregaríamos a função, mas quando isso não for possível, você acaba passando um monte de sinalizadores (ou um monte de valores, e se eles são ou não passados é o sinalizador).
Eu acho que é mais legível, até certo ponto; mas como outros já mencionaram, ter muitos parâmetros é um cheiro de código, por isso não vejo muito uso para isso em uma linguagem orientada a objetos como C #.
fonte