¿Es aceptable utilizar funciones \ métodos lambda en software empresarial?

26

He notado publicaciones aquí que demuestran el uso de las funciones delegados \ lambda para resolver el agujero en la idea central sin mucha repetición: http://www.markhneedham.com/blog/2009/04/04/functional-c -el-agujero-en-el-medio-patrón /

El problema parece ser que los desarrolladores junior y otros no necesariamente entienden cuál es el concepto de función puntero de función \ delegado \ lambda, lo que parece dificultar la lectura (y posiblemente la depuración) del código.

¿Deberíamos evitar o limitar severamente el uso de esta herramienta en la redacción de software empresarial, especialmente en equipos pequeños o tiendas de desarrolladores únicos?

¿O es aceptable usarlo con los comentarios apropiados y esperar que cuando ya no esté cerca, el próximo desarrollador entienda o aprenda sobre las funciones lambda?

Peter Smith
fuente
10
En Ruby, las lambdas (como ellas mismas y en forma de bloques) son un concepto central del lenguaje. Se usan en todas partes, desde Arrayclases hasta ORM complicados. Bueno, nadie se queja.
whitequark
18
Estoy publicando esto como un comentario en lugar de una respuesta porque es solo una variación de lo que todos los demás ya han dicho: seguiría adelante y los usaría. Al contrario de lo que la mayoría de la gente ha dicho, no me molestaría en agregar comentarios por todas partes solo para explicar que está utilizando una función de lenguaje que, honestamente, es bastante simple. Los comentarios deben explicar la lógica empresarial y por qué se hicieron las elecciones de implementación, no educar a los desarrolladores sobre las características del lenguaje con las que ya deberían estar familiarizados. Si sabe que sus desarrolladores junior no entienden lambdas, siéntelos y explique el concepto.
Mitch Lindgren
3
¿Qué pasa si un codificador Junior quiere usar lambdas pero le preocupa que los viejos hackers de C ++ no lo consigan? Suena como ni lambdas, ni ... algoritmos deben usarse en software de negocios.
Trabajo
10
Si fuera por esta actitud, todavía haríamos fuego frotando dos monitores monocromos.
sbi
3
Los punteros a las funciones se piensan en los cursos universitarios C. Y también tiene delegados en C #, por lo que casi cualquier desarrollador debería sentirse bastante cómodo con las funciones como tipo / parámetro de datos. Escribe el código que mejor puedas escribir.
Daniel Iankov

Respuestas:

23

El problema parece ser que los desarrolladores junior y otros no necesariamente entienden cuál es el concepto de función puntero de función \ delegado \ lambda

Francamente, ese es su problema. Para eso te aseguras de que tengan entrenamiento. No puede no usar una buena técnica solo porque algunas personas podrían no entenderla. Si necesitan ayuda con eso, pueden venir a preguntarle al autor. Más importante aún, las funciones lambda se están convirtiendo en características del lenguaje extremadamente comunes.

¿No deberíamos usar la herencia porque algunas personas no la entienden? Demonios, algunas personas se niegan a creer en la ciencia o en los gérmenes o en cualquier forma de cosas ridículas. Debe poder seguir adelante y no dejar que la posibilidad de que otros no puedan seguirle el paso le impida escribir el mejor código que pueda. Las funciones de Lambda son una gran característica y una gran ayuda para escribir código, y debe tomar toda la ayuda que pueda obtener.

Un desarrollador debe saber cómo usar el lenguaje que es menor o no. Si no lo hacen, despídalos y encuentre a alguien que lo haga, o capacítelos para que lo hagan.

DeadMG
fuente
11
Bueno, prohibiría la herencia antes de prohibir las lambdas ...;)
fredoverflow
49

Sí, úsalos.

Soy un desarrollador junior y conozco / entiendo lambdas (y los otros conceptos que mencionaste). No hay nada que pueda evitar que un desarrollador junior aprenda todos esos conceptos en muy poco tiempo. Los jóvenes pueden no tener la misma cantidad de experiencia / experiencia cuando se trata de muchas trampas de desarrollo de software, sin embargo, conceptos como lambdas pueden ser fácilmente entendidos por cualquier persona con un conocimiento básico de programación y conexión a Internet. Además, parece extraño que haya elegido lambdas como ejemplo, teniendo en cuenta que si está usando C #, es probable que ni siquiera tenga mucha ventaja en aprender lambdas sobre los desarrolladores junior (solo se introdujeron en 2008, si yo recuerda correctamente).

En resumen, no hay necesidad de simplificar su código para los neófitos. Estaremos bien, y en realidad preferiríamos trabajar en la mejor implementación posible que se nos ocurra. :)

Morgan Herlocker
fuente
44
A menos que nosotros, los neófitos sean lentos. En ese caso, por favor, simplifique el código para nosotros, o ... no nos contrate en primer lugar.
Trabajo
19
@ Job: creo que solo debemos ser francos y decir que si un junior no puede entender la sintaxis lambda en un par de días (siendo bastante generoso), entonces podría ser un problema de contratación.
Morgan Herlocker
2
Dirija a los neófitos a stackoverflow.com/questions/2167360/… ... esta fue una excelente respuesta a mi pregunta en ese momento y me ayudó a entender mejor a Linq y lambdas.
Resumen de
20

Si son una solución sensata a su problema, entonces debe usarlos.

No se restrinja artificialmente: es más probable que termine con un código de baja calidad que es difícil de mantener.

Si el código está bien escrito con los comentarios apropiados, los siguientes deberían poder aprender de usted.

ChrisF
fuente
13

Coloque un enlace a la documentación de msdn en los comentarios en la parte superior de un bloque que lo usa y luego continúe. No debe tener miedo de usar tecnología nueva / compleja, es parte del trabajo de los desarrolladores aprender cosas que no saben.

Tom Squires
fuente
14
¿Es realmente necesario un enlace?
Morgan Herlocker
3
¿Realmente pondrías un enlace cada vez que utilizas una lambda?
Federico klez Culloca
la complejidad es el enemigo ...
Robert S Ciaccio
11

El problema parece ser que los desarrolladores junior y otros no necesariamente entienden cuál es el concepto de función puntero de función \ delegado \ lambda

Entonces necesitan aprenderlos. Período.

  1. Este no es un rincón esotérico de C #. Debe comprenderlos para utilizar muchas bibliotecas .Net.
  2. Este no es un tema de lenguaje esotérico, en general. Prácticamente todos los lenguajes de uso popular hoy en día tienen cierto sabor de puntero de función, y la mayoría tiene (o pronto lo están haciendo, en el caso de Java y C ++) cierres.

Solo tómate unos minutos para explicárselos. No es dificil.

Barro
fuente
5

Debe usar la herramienta adecuada para el trabajo. Si hay una manera más simple y clara de resolver el problema en cuestión, úselo. Si necesita profundizar en algo que cree que podría ser un tema avanzado para futuros mantenedores, márquelo claramente e incluya un puntero a la documentación que explique la técnica.

el puntero de función \ delegado \ concepto de función lambda

Cabe señalar que esas son tres cosas diferentes.

Caleb
fuente
3

Dos escenarios posibles:

a) Sus colegas (o la mayoría de ellos) son razonablemente hábiles. Necesitan aprender lambdas, son parte del lenguaje y, a veces, son exactamente la herramienta adecuada para el trabajo. Entonces, cuando realmente son la mejor herramienta, por supuesto, úsalas. Simplemente evite usarlos porque acaba de enterarse de ellos y está emocionado y piensa que son una bala de plata.

b) Sus colegas (o la mayoría de ellos) son incompetentes. No hay forma de que nunca entiendan completamente las lambdas, los cierres, los punteros de función o cualquier otro concepto de metacodificación similar. Probablemente ya estén luchando por comprender los punteros, las referencias y la recursividad. En esta situación, lo mejor que puede hacer es morder la bala, usar una solución torpe, verbosa, libre de lambda y cepillar su CV, ya que debería buscar trabajo.

tdammers
fuente
2

Aquí es donde la consistencia puede ayudar mucho. Si lo usa consistentemente con el mismo estilo, etc., entonces los lectores solo tienen que aprenderlo una vez, y luego lo reconocen en todas partes.

Además, podría ser explícito, al menos al principio. Por ejemplo, estos dos son equivalentes:

doSomething(() => someMethod());

doSomething(someMethod);

private void doSomething(Action someAction) { ... }
private void someMethod() { ... }

... pero en el primer caso, es obvio, si conoce la sintaxis lambda, lo que estamos haciendo. Incluso si no conoce la sintaxis lambda, es obvio que está viendo algo nuevo y tiene que buscarlo. En el segundo caso, parece que estás pasando una variable.

Sé que ReSharper lo empuja a cambiarlo al segundo caso, pero me pregunto si eso siempre es una buena idea. En el segundo caso, debes saber que se doSomethingnecesita un Action.

Scott Whitlock
fuente
1
Usaría el segundo, veo que se pasa someMethod, y para determinar qué es someMethod, hago clic derecho e ir a def'n. veo que es una función / método y debería tener sentido para cualquier programador en ese punto.
CaffGeek
@Chad: es como decir "Usaría una palabra más corta que el lector es menos probable que sepa, y supongo que lo está leyendo en un Kindle, por lo que tienen que desplazar el cursor hacia arriba para que parezca en el diccionario para ellos, en lugar de usar una palabra más larga y descriptiva, estoy bastante seguro de que lo saben. Y joder a las personas sin Kindles ". No estoy de acuerdo con esa lógica. El código se lee más de lo que se escribe.
Scott Whitlock
"En el segundo caso, debes saber que se doSomethingnecesita un Action". ¿Y cómo es eso diferente de tener que saber que se functionWithNameThatDoesNotSpecifyItsArgumentTypesnecesita un ObjectOfSomeType? De hecho, en lenguajes donde las funciones son verdaderos objetos de primera clase, no es diferente.
JAB
1

A menudo encuentro ciertos conceptos difíciles de entender porque solo se describen en abstracto, en lugar de encontrarlos en situaciones prácticas de la vida real. Así que personalmente estaría a favor de encontrar tales construcciones.

El escenario principal en el que puedo pensar para evitar hacer esto es si la programación no es la tarea principal de la otra persona. Por ejemplo, un administrador del sistema o un bioinformático que pasa la mayor parte del tiempo haciendo experimentos reales (una "rata de laboratorio").

Andrew Grimm
fuente
1
itemsList.ForEach(item => DoAction(item));
...
public void DoAction(Item item) {
  //...do various things here...
}

Ahora, tal vez aquí estamos llamando DoAction porque su cuerpo es demasiado largo para caber dentro de la lambda misma. En ese caso, usar el método de extensión ForEach () a List no nos brinda muchos beneficios sobre el uso del bucle foreach regular, aunque supongo que guarda un par de líneas de código. Pero en este caso en particular, el uso de ForEach () puede habernos llevado a hacer algo que realmente requiere más código y causar un poco de agitación adicional en la pila de lo necesario; El argumento aprobado no necesita ser una Lambda en absoluto

Simplemente debe llamar a DoAction de esta manera:

itemsList.ForEach(DoAction);

No hay Lambda en absoluto. La clave es recordar qué es lo que realmente estás pasando cuando creas una expresión lambda: algo así como un atajo para definir una instancia de delegado. Sí, también tiene beneficios como el cierre, pero no se debe perder el sitio de lo que espera la llamada al método. En este caso, espera una dirección para un método que coincida con la firma de Action. DoAction ya es un método así, por lo que crear el lambda es solo agregar una llamada a un método totalmente innecesario.

manpreet dhillon
fuente
-1

En mi humilde opinión, escribir en cualquier nivel técnico superior al nivel técnico del equipo, está mal. Si los miembros de su equipo no se sienten realmente cómodos con las expresiones y funciones lambda y no tienen tiempo para aprenderlo (deberían dedicar su tiempo a la base de datos de ajuste de rendimiento, trabajar más en la interfaz de usuario, crear componentes, etc.), entonces sugiero no usarlos . Sin embargo, si están dispuestos a aprender y tienen tiempo libre, o si ya conocen el conocimiento, ¿por qué no?

Creo que este es un problema relativo que debe juzgarse por equipo y nivel técnico del equipo. Y este no es solo el caso de las funciones lambda. Este es el caso del conocimiento técnico. Entonces, por ejemplo, cada vez que un equipo conoce el patrón de repositorio tiene la experiencia para implementarlo y mantenerlo, entonces déjelo hacerlo. Pero si no lo hacen, simplemente encuentre otra forma. Si saben acerca de OO JavaScript, entonces déjenlos crear un código más escalable en JavaScript. Pero si no lo hacen, simplemente regrese a JavaScript procesal.

Saeed Neamati
fuente