esiste un termine per fare questo: func1 (func2 (), func3 ());


24

So che obj.func1().func2()si chiama metodo concatenamento, ma qual è il termine tecnico per:

func1(func2(), func3());

Dove il ritorno di una funzione viene utilizzato come argomento per un'altra.


8
obj.func1().func2() is called method chaining- Correzione: si chiama un disastro ferroviario.
Yam Marcovic,

Sembra molto, molto, molto complicato a meno che tu non sia assolutamente sicuro che obj.func1()restituisca sempre un oggetto che ha func2()come funzione membro.
Shadur,

8
@Yam Care per spiegare? È impiegato per ottenere grandi profitti in interfacce fluide, tra gli altri. Ti riferisci alla Legge di Demetra? In tal caso, ciò non proibisce il modello sopra riportato, e anche nei casi in cui lo fa, c'è un buon caso contro il LoD.
Konrad Rudolph,

1
il metodo del concatenamento si trova su uno scaffale con zucchero sintattico, non c'è bisogno di fare storie.
Kos,

1
@ PauliØsterø Ho pensato che questo fosse lo scopo del tracciamento dello stack.
Chris C,

Risposte:


38

Non credo sia la composizione delle funzioni. Composizione delle funzioni significa prendere due o più funzioni e trasformarle in una nuova funzione, come f . g . hin Haskell. Si noti che nessuna funzione viene chiamata a questo punto.

Personalmente, vorrei riferirmi a costrutti come func1(func2(), func3())"chiamate di funzione nidificate".


+1, è indicato come "chiamate di funzione nidificate" in tutti i contesti di programmazione che ho visto.
Izkata,

1
+1, chiamare questa "composizione di funzioni" è ingannevolmente sbagliato.
Gian

+1. Tutto f(g())ciò che sta facendo è chiamare f()con un'espressione per il primo argomento, e così succede che la chiamata di funzione si g()qualifica come espressione. Ma se ci deve essere un nome per questo, questo è il più vicino possibile.
Blrfl,

16

In matematica, si chiama composizione delle funzioni . Non credo di aver sentito il termine applicato alla programmazione, però. Ciò può essere dovuto al fatto che l'utilizzo è ampiamente evitato per alcuni motivi. Può introdurre strani bug quando le funzioni hanno effetti collaterali, poiché i compilatori sono liberi di valutare func3 prima di func2. È più difficile eseguire il debug perché non è possibile impostare punti di interruzione o stampare risultati intermedi e la maggior parte delle persone trova semplicemente più difficile leggere.


4
Si chiama composizione anche nella programmazione funzionale.
Chuck,

8
Non penso che sia "ampiamente evitato". IMO non è raro scrivere codice come printf("%d %d\n", strlen(a), strlen(b));invece di usare variabili intermedie.
user281377

3
Penso che la soluzione agli strani bug quando le funzioni hanno effetti collaterali non è quella di evitare questo, ma piuttosto di scrivere funzioni che producono valori e hanno effetti collaterali. Allo stesso modo, per quanto riguarda i debugger, la soluzione dovrebbe essere quella di chiedere un debugger migliore, che non ti costringa a cambiare il codice per far funzionare il debugger.
R. Martinho Fernandes,

7
Il fatto che il compilatore sia libero di valutare func3 prima di func2 dipende interamente dalla lingua utilizzata. In Java, ad esempio, l'ordine di valutazione è rigorosamente specificato. In realtà sospetto che questo sia il caso della maggior parte delle lingue.
Michael Borgwardt,

2
Il termine "composizione di funzioni" in matematica si applica in realtà solo alle funzioni a argomento singolo, dove si riferisce a una struttura della forma func1(func2(func3(x))). O tecnicamente, si riferisce alle funzioni stesse: se g(x) = f1(f2(f3(x))), allora g( non g(x) ) è la composizione di f1, f2e f3. Mentre potevo vedere un modo in cui potresti chiamare la struttura nella domanda "composizione funzionale", mi sembra un uso molto insolito del termine, in senso matematico.
David Z,

2

Come indica @Karl Bielefeldt, si chiama composizione di funzioni in matematica.

Non esiste un termine tecnico per questa cosa nella programmazione. E penso che questa sia una buona cosa, perché indica che l'operazione è normale e ortogonale .

L'ortogonalità nei linguaggi di programmazione significa che è possibile utilizzare un'istruzione / operazione indipendentemente dal suo contesto . Ad esempio, puoi chiamare una funzione / metodo in tutti i seguenti modi e si comporterebbe lo stesso ...

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

Puoi leggere di più sull'ortogonalità nella programmazione su Wikipedia , e c'è una domanda su StackOverflow su questo.


Non indica l'ortogonalità ma dipende da quello.
Raffael,

+1 stai solo passando valori, non c'è magia nella chiamata del PO
vemv

1

Non sono molto bravo con i termini, ma qualche giorno fa ho letto un articolo che fa riferimento al termine Funzioni di ordine superiore , ed ecco un riassunto della definizione per Wikipedia:

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

In matematica e informatica, funzioni di ordine superiore, forme funzionali o funzionali sono funzioni che svolgono almeno una delle seguenti operazioni:

  • accetta una o più funzioni come input
  • emette una funzione

Tutte le altre funzioni sono funzioni di primo ordine. In matematica le funzioni di ordine superiore sono anche note come operatori o funzionali. La derivata nel calcolo è un esempio comune, poiché associa una funzione a un'altra funzione.

quindi in questo caso, dal momento che quello scenario assume almeno una funzione come input / param, sarebbe considerato una funzione di ordine superiore, credo.


1
No, sarebbe come chiamare una funzione di ordine superiore func1(func2, func3). Nota la parentesi assente.
Fredoverflow,

ha senso Fred. uno è l'indirizzo di una funzione e l'altro il risultato dell'esecuzione di quella funzione. Grazie per la segnalazione.
silverCORE
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.