existe-t-il un terme pour le faire: func1 (func2 (), func3 ());

24

Je sais que cela obj.func1().func2()s'appelle le chaînage de méthodes, mais quel est le terme technique pour:

func1(func2(), func3());

Où le retour d'une fonction est utilisé comme argument pour une autre.

zhenka
la source
8
obj.func1().func2() is called method chaining- Correction: ça s'appelle une épave de train.
Yam Marcovic
Cela semble très, très, très délicat, sauf si vous êtes absolument sûr de obj.func1()toujours renvoyer un objet qui a func2()comme fonction membre.
Shadur
8
@Yam Care à expliquer? Il est utilisé pour un grand profit dans des interfaces fluides, entre autres. Vous parlez de la loi de Déméter? Si c'est le cas, cela n'interdit pas le modèle ci-dessus, et même dans les cas où il le fait, il y a un bon argument contre le LoD.
Konrad Rudolph
1
enchaînement de méthodes se trouve sur une étagère avec du sucre syntaxique, pas besoin de faire d'histoires dessus.
Kos
1
@ PauliØsterø Je pensais que c'était à ça que servait le traçage de pile.
Chris C

Réponses:

38

Je ne pense pas que ce soit la composition des fonctions. La composition des fonctions signifie prendre deux fonctions ou plus et les transformer en une nouvelle fonction, comme f . g . hdans Haskell. Notez qu'aucune fonction n'est appelée à ce stade.

Personnellement, je ferais référence à des constructions comme des func1(func2(), func3())«appels de fonction imbriqués».

fredoverflow
la source
+1, il est appelé «appels de fonction imbriqués» dans tous les contextes de programmation que j'ai vus.
Izkata
1
+1, appeler cette "composition de fonction" est trompeusement faux.
Gian
+1. Il f(g())suffit d'appeler f()avec une expression pour le premier argument, et il arrive que l'appel de fonction soit considéré g()comme une expression. Mais s'il doit y avoir un nom, c'est aussi proche que possible.
Blrfl
16

En mathématiques, cela s'appelle la composition des fonctions . Je ne pense pas avoir entendu le terme appliqué à la programmation, cependant. Cela peut être dû au fait que l'utilisation est largement évitée pour plusieurs raisons. Il peut introduire des bogues étranges lorsque les fonctions ont des effets secondaires, car les compilateurs sont libres d'évaluer func3 avant func2. Il est plus difficile à déboguer, car vous ne pouvez pas définir de points d'arrêt ou imprimer des résultats intermédiaires, et la plupart des gens trouvent tout simplement plus difficile à lire.

Karl Bielefeldt
la source
4
Cela s'appelle également la composition dans la programmation fonctionnelle.
Chuck
8
Je ne pense pas que ce soit "largement évité". OMI, il n'est pas rare d'écrire du code comme printf("%d %d\n", strlen(a), strlen(b));au lieu d'utiliser des variables intermédiaires.
user281377
3
Je pense que la solution aux bogues étranges lorsque les fonctions ont des effets secondaires n'est pas d'éviter cela, mais plutôt d'éviter d'écrire des fonctions qui produisent des valeurs et ont des effets secondaires. De même, en ce qui concerne les débogueurs, la solution devrait être de demander un meilleur débogueur, qui ne vous oblige pas à changer votre code pour faire fonctionner le débogueur.
R. Martinho Fernandes
7
Le fait que le compilateur soit libre d'évaluer func3 avant func2 dépend entièrement du langage utilisé. En Java, par exemple, l'ordre d'évaluation est strictement spécifié. Je soupçonne en fait que c'est le cas pour la plupart des langues.
Michael Borgwardt
2
Le terme "composition de fonction" en mathématiques ne s'applique en fait qu'aux fonctions à argument unique, où il se réfère à une structure de la forme func1(func2(func3(x))). Ou sur le plan technique, il fait référence aux fonctions elles - mêmes: si g(x) = f1(f2(f3(x))), alors g( non g(x) ) est la composition f1, f2et f3. Alors que je pouvais voir une façon dont vous pourriez appeler la structure dans la question «composition de la fonction», cela me semble être une utilisation très inhabituelle du terme, dans un sens mathématique.
David Z
2

Comme le souligne @Karl Bielefeldt, cela s'appelle la composition de fonctions en mathématiques.

Il n'y a AUCUN terme technique pour cette chose dans la programmation. Et je pense que c'est une bonne chose, car cela indique que l'opération est normale et orthogonale .

L'orthogonalité dans les langages de programmation signifie que vous pouvez utiliser une instruction / opération indépendante de son contexte . Par exemple, vous pouvez appeler une fonction / méthode de toutes les manières suivantes, et elle se comporterait de la même manière ...

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();

Vous pouvez en savoir plus sur l'orthogonalité dans la programmation sur Wikipedia , et il y a une question sur StackOverflow à ce sujet.

treecoder
la source
Cela n'indique pas l'orthogonalité mais dépend de cela.
Raffael
+1 vous passez juste des valeurs, il n'y a pas de magie dans l'appel du PO
vemv
1

Je ne suis vraiment pas très bon avec les termes, mais je viens de lire un article il y a quelques jours qui faisait référence au terme fonctions d'ordre supérieur , et voici un résumé de la définition par Wikipedia:

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

En mathématiques et en informatique, les fonctions d'ordre supérieur, les formes fonctionnelles ou les fonctionnelles sont des fonctions qui remplissent au moins l'une des fonctions suivantes:

  • prendre une ou plusieurs fonctions en entrée
  • sortie d'une fonction

Toutes les autres fonctions sont des fonctions de premier ordre. En mathématiques, les fonctions d'ordre supérieur sont également appelées opérateurs ou fonctionnelles. La dérivée du calcul est un exemple courant, car elle associe une fonction à une autre fonction.

dans ce cas, puisque ce scénario prend au moins une fonction comme entrée / paramètre, il serait considéré comme une fonction d'ordre supérieur, je crois.

silverCORE
la source
1
Non, appeler une fonction d'ordre supérieur ressemblerait func1(func2, func3). Notez la parenthèse absente.
fredoverflow
c'est logique Fred. l'un est l'adresse d'une fonction et l'autre le résultat de l'exécution de cette fonction. Merci d'avoir fait remarquer cela.
silverCORE