Me doy cuenta de que esto es parcialmente subjetivo, pero en general tengo curiosidad por la opinión de la comunidad y no he podido encontrar con éxito una pregunta existente que aborde este tema.¿Cuándo hace demasiado un lambda en un método de extensión?
Estoy en un debate un tanto religioso con un compañero de trabajo sobre una determinada instrucción Select en una consulta L2EF.
.Select(r =>
{
r.foo.Bar = r.bar;
r.foo.Bar.BarType = r.Alpha;
if (r.barAddress != null)
{
r.foo.Bar.Address = r.barAddress;
r.foo.Bar.Address.State = r.BarState;
}
if (r.baz != null)
{
r.foo.Bar.Baz = r.baz;
if (r.bazAddress != null)
{
r.foo.Bar.Baz.Address = r.bazAddress;
r.foo.Bar.Baz.Address.State = r.BazState;
}
}
return r.foo;
})
Advertencias:
- Esto es Linq-to-Entidades
- Esto es después de el trabajo en el DB como han realizado y devuelto
- El parámetro de entrada
r
es anónima
Personalmente, soy de la opinión en (a) la cláusula de selección no debería estar alterando valores, simplemente debería proyectarse. Su contra argumento es que no está alterando nada, solo se está asegurando de que todo se inicialice correctamente como resultado de la consulta DB. En segundo lugar, creo que una vez que empiece a entrar en bloques de código completos y declaraciones de devolución, es hora de definir un método o incluso un Func<T, U>
y no hacer todo esto en línea. El complicador aquí es, una vez más, que la entrada es anónima, por lo que habría que definir un tipo. Sin embargo, aún estamos debatiendo el punto general, sino el específico.
Entonces, ¿cuándo una expresión lambda hace demasiado? ¿Dónde dibujas la línea borrosa en la arena?
Parece que la complejidad del código sigue la complejidad del tipo anónimo; ¿Es un tipo anónimo tan complejo realmente necesario? –
@Dan, la consulta real implica uniones a la izquierda que atraviesan 8 entidades diferentes, con el tipo anónimo que simplemente contiene los objetos de esas entidades. no es un tipo anónimo complejo, per se, simplemente no está definido. es como 'seleccionar nuevo {foo, bar, baz,/* etc. * /}' –
Esto es obviamente un Seleccionar con efectos secundarios. No es la intención. Para eso, hay 'foreach();'. – Dykam