No hay razones súper claras de por qué usar este tipo de sintaxis en primer lugar.
En general, trate de evitar tener argumentos booleanos que a distancia puedan parecer arbitrarios. includeManagement
(muy probablemente) afectará en gran medida el resultado. Pero el argumento parece que tiene "poco peso".
Se ha discutido el uso de una enumeración, no solo parecerá que el argumento "tiene más peso", sino que también proporcionará escalabilidad al método. Sin embargo, esta podría no ser la mejor solución en todos los casos, ya que su ReturnEmployeeIds
método tendrá que escalar junto al WhatToInclude
-enum (vea la respuesta de NiklasJ ). Esto podría darte un dolor de cabeza más tarde.
Considere esto: si escala el WhatToInclude
-enum, pero no el ReturnEmployeeIds
-metodo. Entonces podría arrojar un ArgumentOutOfRangeException
(mejor de los casos) o devolver algo completamente no deseado ( null
o vacío List<Guid>
). Lo que en algunos casos puede confundir al programador, especialmente si ReturnEmployeeIds
está en una biblioteca de clases, donde el código fuente no está disponible.
Se supondrá que WhatToInclude.Trainees
funcionará si lo WhatToInclude.All
hace, ya que los alumnos son un "subconjunto" de todos.
Esto (por supuesto) depende de cómo ReturnEmployeeIds
se implemente.
En los casos en que se pueda pasar un argumento booleano, intento dividirlo en dos métodos (o más, si es necesario), en su caso; uno podría extraerReturnAllEmployeeIds
, ReturnManagementIds
y ReturnRegularEmployeeIds
. Esto cubre todas las bases y se explica por sí mismo a quien lo implemente. Esto tampoco tendrá el problema de "escala" mencionado anteriormente.
Dado que solo hay dos resultados para algo que tiene un argumento booleano. Implementar dos métodos requiere muy poco esfuerzo adicional.
Menos código, rara vez es mejor.
Con esto dicho, no son algunos casos en los que expresamente se declara el argumento mejora la legibilidad. Considerar por ejemplo. GetLatestNews(max: 10)
. GetLatestNews(10)
es todavía bastante auto-explicativo, la declaración explícita de max
ayuda aclarará cualquier confusión.
Y si absolutamente debe tener un argumento booleano, qué uso no puede inferirse simplemente leyendo true
o false
. Entonces diría que:
var ids = ReturnEmployeeIds(includeManagement: true);
.. es absolutamente mejor y más legible que:
var ids = ReturnEmployeeIds(true);
Como en el segundo ejemplo, true
podría significar absolutamente cualquier cosa . Pero trataría de evitar este argumento.
boolean
argumentos de método, y cómo?