¿hay un término para hacer esto: func1 (func2 (), func3 ());

24

Sé que obj.func1().func2()se llama encadenamiento de métodos, pero cuál es el término técnico para:

func1(func2(), func3());

Donde el retorno de una función se usa como argumento para otra.

zhenka
fuente
8
obj.func1().func2() is called method chaining- Corrección: se llama choque de trenes.
Yam Marcovic
Eso suena muy, muy, muy complicado a menos que esté absolutamente seguro de que obj.func1()siempre devuelve un objeto que tiene func2()como función miembro.
Shadur
8
@Yam ¿Te gustaría explicarlo? Se emplea para obtener grandes ganancias en interfaces fluidas, entre otras. ¿Te refieres a la Ley de Deméter? Si es así, esto no prohíbe el patrón anterior, e incluso en los casos en que lo hace, hay un buen caso contra el LoD.
Konrad Rudolph
1
El método de encadenamiento se encuentra en un estante con azúcar sintáctico, no es necesario preocuparse por ello.
Kos
1
@ PauliØsterø Pensé que para eso estaba destinado el seguimiento de la pila.
Chris C

Respuestas:

38

No creo que sea composición de funciones. La composición de funciones significa tomar dos o más funciones y convertirlas en una nueva función, como f . g . hen Haskell. Tenga en cuenta que no se llama a ninguna función en este momento.

Personalmente, me referiría a construcciones func1(func2(), func3())como "llamadas de función anidadas".

flujo libre
fuente
+1, se conoce como "llamadas a funciones anidadas" en todos los contextos de programación que he visto.
Izkata
1
+1, llamar a esta "composición de funciones" es engañosamente erróneo.
Gian
+1. Todo lo que f(g())está haciendo es llamar f()con una expresión para el primer argumento, y sucede que la llamada a la función g()califica como una expresión. Pero si tiene que haber un nombre para él, esto es lo más cercano posible.
Blrfl
16

En matemáticas, se llama composición de funciones . Sin embargo, no creo haber escuchado el término aplicado a la programación. Eso puede deberse a que el uso se evita en gran medida por algunas razones. Puede introducir errores extraños cuando las funciones tienen efectos secundarios, debido a que los compiladores son libres de evaluar func3 antes de func2. Es más difícil de depurar porque no puede establecer puntos de interrupción o imprimir resultados intermedios, y la mayoría de las personas simplemente les resulta más difícil de leer.

Karl Bielefeldt
fuente
44
También se llama composición en la programación funcional.
Chuck
8
No creo que se "evite en gran medida". En mi opinión, no es raro escribir código como en printf("%d %d\n", strlen(a), strlen(b));lugar de usar variables intermedias.
user281377
3
Creo que la solución a los errores extraños cuando las funciones tienen efectos secundarios no es evitar esto, sino evitar escribir funciones que producen valores y tienen efectos secundarios. Del mismo modo, con respecto a los depuradores, la solución debería ser solicitar un mejor depurador, uno que no lo obligue a cambiar su código para que el depurador funcione.
R. Martinho Fernandes
77
Si el compilador es libre de evaluar func3 antes de func2 depende completamente del lenguaje utilizado. En Java, por ejemplo, el orden de evaluación está estrictamente especificado. Sospecho que este es el caso para la mayoría de los idiomas.
Michael Borgwardt
2
El término "composición de funciones" en matemáticas en realidad solo se aplica a funciones de un solo argumento, donde se refiere a una estructura de la forma func1(func2(func3(x))). O técnicamente, se refiere a las funciones mismos: si g(x) = f1(f2(f3(x))), a continuación, g( no g(x) ) es la composición de f1, f2y f3. Si bien pude ver una forma en que podría llamar a la estructura en la pregunta "composición de funciones", me parece un uso muy inusual del término, en un sentido matemático.
David Z
2

Como señala @Karl Bielefeldt, se llama composición de funciones en matemáticas.

No hay término técnico para esto en la programación. Y creo que esto es bueno, porque indica que la operación es normal y ortogonal .

La ortogonalidad en los lenguajes de programación significa que puede usar una instrucción / operación independiente de su contexto . Por ejemplo, puede llamar a una función / método de todas las formas siguientes, y se comportaría igual ...

f1()(f2(), f3());

x = y + f4();

if ( f5() && !f6() ) doSomething();

f7() = f8() + f9(); // in C++ when a function returns a reference

x = f10() ? f11(f12(f13(x))) : f14();

Puede leer más sobre Ortogonalidad en Programación en Wikipedia , y hay una pregunta sobre StackOverflow sobre esto.

codificador de árboles
fuente
No indica ortogonalidad, sino que depende de eso.
Raffael
+1 solo estás pasando valores, no hay magia en la llamada del OP
vemv
1

Realmente no soy tan bueno con los términos, pero hace unos días leí un artículo que hace referencia al término Funciones de orden superior , y aquí hay un resumen de la definición según Wikipedia:

http://en.wikipedia.org/wiki/Higher-order_function

En matemáticas y ciencias de la computación, las funciones de orden superior, formas funcionales o funcionales son funciones que hacen al menos uno de los siguientes:

  • tomar una o más funciones como entrada
  • dar salida a una función

Todas las demás funciones son funciones de primer orden. En matemáticas, las funciones de orden superior también se conocen como operadores o funcionales. La derivada en el cálculo es un ejemplo común, ya que asigna una función a otra función.

así que en este caso, dado que ese escenario toma al menos una función como entrada / parámetro, creo que se consideraría una función de orden superior.

silverCORE
fuente
1
No, sería una llamada a una función de orden superior func1(func2, func3). Tenga en cuenta el paréntesis ausente.
fredoverflow
Eso tiene sentido Fred. uno es la dirección de una función y el otro el resultado de ejecutar esa función. Gracias por señalar eso.
silverCORE