Não há motivos super claros para usar esse tipo de sintaxe em primeiro lugar.
Em geral, tente evitar ter argumentos booleanos que à distância podem parecer arbitrários. includeManagement
(provavelmente) afetará bastante o resultado. Mas o argumento parece ter "pouco peso".
O uso de um enum foi discutido, não apenas parecerá que o argumento "carrega mais peso", mas também fornecerá escalabilidade para o método. No entanto, essa pode não ser a melhor solução em todos os casos, já que o seu ReturnEmployeeIds
método-terá que ser escalado ao lado do WhatToInclude
-enum (consulte a resposta de NiklasJ ). Isso pode causar dor de cabeça mais tarde.
Considere o seguinte: Se você dimensionar o WhatToInclude
método -enum, mas não o ReturnEmployeeIds
método. Pode então lançar um ArgumentOutOfRangeException
(melhor caso) ou retornar algo completamente indesejado ( null
ou vazio List<Guid>
). O que, em alguns casos, pode confundir o programador, especialmente se você ReturnEmployeeIds
estiver em uma biblioteca de classes, onde o código-fonte não está prontamente disponível.
Supõe-se que WhatToInclude.Trainees
funcionará se WhatToInclude.All
funcionar, visto que os trainees são um "subconjunto" de todos.
Isso depende, é claro, de como ReturnEmployeeIds
é implementado.
Nos casos em que um argumento booleano pode ser passado, tento dividi-lo em dois métodos (ou mais, se necessário), no seu caso; pode-se extrair ReturnAllEmployeeIds
, ReturnManagementIds
e ReturnRegularEmployeeIds
. Isso cobre todas as bases e é absolutamente auto-explicativo para quem a implementa. Isso também não terá o item "scaling", mencionado acima.
Como existem apenas dois resultados para algo que possui um argumento booleano. A implementação de dois métodos exige muito pouco esforço extra.
Menos código, raramente é melhor.
Com isto dito, não são alguns casos onde explicitamente declarar o argumento melhora a legibilidade. Considere, por exemplo. GetLatestNews(max: 10)
. aindaGetLatestNews(10)
é bastante auto-explicativo, a declaração explícita de ajudará a esclarecer qualquer confusão.max
E se você absolutamente deve ter um argumento booleano, qual uso não pode ser inferido apenas lendo true
ou false
. Então eu diria que:
var ids = ReturnEmployeeIds(includeManagement: true);
.. é absolutamente melhor e mais legível que:
var ids = ReturnEmployeeIds(true);
Como no segundo exemplo, isso true
pode significar absolutamente qualquer coisa . Mas eu tentaria evitar esse argumento.
boolean
argumentos de método e como?