Contexto
En Clean Code , página 35, dice
Esto implica que los bloques dentro de las declaraciones if, las declaraciones else, las declaraciones while, etc. deben tener una línea de longitud. Probablemente esa línea debería ser una llamada de función. Esto no solo mantiene la función de cierre pequeña, sino que también agrega valor documental porque la función llamada dentro del bloque puede tener un nombre muy descriptivo.
Estoy completamente de acuerdo, eso tiene mucho sentido.
Más adelante, en la página 40, dice sobre argumentos de función
El número ideal de argumentos para una función es cero (niládico). Luego viene uno (monádico), seguido de cerca por dos (diádico). Se deben evitar tres argumentos (triádicos) siempre que sea posible. Más de tres (poliádico) requieren una justificación muy especial, y de todos modos no deberían usarse. Los argumentos son difíciles. Toman mucho poder conceptual.
Estoy completamente de acuerdo, eso tiene mucho sentido.
Problema
Sin embargo, con bastante frecuencia me encuentro creando una lista a partir de otra lista y tendré que vivir con uno de los dos males.
O uso dos líneas en el bloque , una para crear la cosa, otra para agregarla al resultado:
public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
List<Flurp> flurps = new List<Flurp>();
foreach (BadaBoom badaBoom in badaBooms)
{
Flurp flurp = CreateFlurp(badaBoom);
flurps.Add(flurp);
}
return flurps;
}
O agrego un argumento a la función para la lista donde se agregará la cosa, lo que lo convierte en "un argumento peor".
public List<Flurp> CreateFlurps(List<BadaBoom> badaBooms)
{
List<Flurp> flurps = new List<Flurp>();
foreach (BadaBoom badaBoom in badaBooms)
{
CreateFlurpInList(badaBoom, flurps);
}
return flurps;
}
Pregunta
¿Hay (des) ventajas que no estoy viendo, que hacen que una de ellas sea preferible en general? ¿O hay tales ventajas en ciertas situaciones; en ese caso, ¿qué debo buscar al tomar una decisión?
f(g(x))
está en contra de su guía de estilo, bueno, no puedo arreglar su guía de estilo. Quiero decir, tampoco te divides sqrt(x*x + y*y)
en cuatro líneas, ¿verdad? Y eso es tres (!) Subexpresiones anidadas en dos (!) Niveles de anidamiento internos (¡jadeo!). Su objetivo debe ser la legibilidad , no las declaraciones de un solo operador. Si quieres lo siguiente, bueno, tengo el lenguaje perfecto para ti: ensamblador.
mov
instrucciones x86 y una sola jmp toStart
al final. Alguien realmente hizo un compilador que hace exactamente eso: D
rlwimi
instrucciones sobre el PPC. (Eso significa Rotar inserción de máscara inmediata de palabra izquierda). Este comando tomó no menos de cinco operandos (dos registros y tres valores inmediatos), y realizó las siguientes operaciones: Un contenido de registro fue rotado por un cambio inmediato, una máscara fue creado con una sola ejecución de 1 bits que fue controlado por los otros dos operandos inmediatos, y los bits que correspondían a 1 bits en esa máscara en el otro operando de registro fueron reemplazados por los bits correspondientes del registro girado. Muy buena instrucción :-)
flurps.Add(CreateFlurp(badaBoom));
?