existe um termo para fazer isso: func1 (func2 (), func3 ());


24

Eu sei que isso obj.func1().func2()é chamado de encadeamento de métodos, mas qual é o termo técnico para:

func1(func2(), func3());

Onde o retorno de uma função é usado como argumento para outro.


8
obj.func1().func2() is called method chaining- Correção: É chamado de acidente de trem.
Yam Marcovic

Isso parece muito, muito, muito complicado, a menos que você tenha certeza absoluta de que obj.func1()sempre retorna um objeto que tem func2()como função membro.
Shadur 17/11/11

8
@Yam Cuidado para explicar? É empregado com grande lucro em interfaces fluentes, entre outros. Você está se referindo à Lei de Demeter? Nesse caso, isso não proíbe o padrão acima e, mesmo nos casos em que existe, existe um bom argumento contra o LoD.
Konrad Rudolph

11
O encadeamento de métodos fica em uma prateleira com açúcar sintático, sem a necessidade de fazer barulho por causa disso.
Kos

11
@ PauliØsterø Eu pensei que é para isso que serve o rastreamento de pilha.
Chris C

Respostas:


38

Não acho que seja composição de funções. Composição de funções significa pegar duas ou mais funções e transformá-las em uma nova função, como f . g . hem Haskell. Observe que nenhuma função é chamada neste momento.

Pessoalmente, eu me referiria a construções como func1(func2(), func3())"chamadas de funções aninhadas".


+1, é chamado de "chamadas de função aninhadas" em todos os contextos de programação que eu já vi.
Izkata

11
+1, chamar essa "composição de função" é enganosamente errado.
Gian

+1. Tudo o que f(g())se faz é chamar f()com uma expressão para o primeiro argumento, e acontece que a chamada de função se g()qualifica como expressão. Mas se tem que haver um nome para isso, é o mais próximo possível.
Blrfl

16

Em matemática, isso se chama composição de funções . Acho que não ouvi o termo ser aplicado à programação. Isso pode ocorrer porque o uso é amplamente evitado por alguns motivos. Ele pode introduzir bugs estranhos quando as funções têm efeitos colaterais, porque os compiladores estão livres para avaliar a função3 antes da função2. É mais difícil depurar porque você não pode definir pontos de interrupção nem imprimir resultados intermediários, e a maioria das pessoas simplesmente acha mais difícil ler.


4
É chamado de composição em programação funcional também.
Chuck

8
Não acho que seja "amplamente evitado". Na IMO, não é incomum escrever código como em printf("%d %d\n", strlen(a), strlen(b));vez de usar variáveis ​​intermediárias.
user281377

3
Eu acho que a solução para os bugs estranhos quando as funções têm efeitos colaterais não é evitar isso, mas sim escrever funções que produzem valores e efeitos colaterais. Da mesma forma, em relação aos depuradores, a solução deve ser pedir um depurador melhor, que não o force a alterar seu código para fazer com que o depurador funcione.
R. Martinho Fernandes

7
Se o compilador livre para avaliar a função3 antes da função2 depende inteiramente do idioma que está sendo usado. Em Java, por exemplo, a ordem de avaliação é estritamente especificada. Eu realmente suspeitaria que esse é o caso da maioria dos idiomas.
precisa

2
O termo "composição de funções" em matemática, na verdade, só se aplica a funções de argumento único, onde se refere a uma estrutura do formulário func1(func2(func3(x))). Ou tecnicamente, refere-se as funções próprias: se g(x) = f1(f2(f3(x))), em seguida, g( não g(x) ), é a composição de f1, f2e f3. Embora eu pudesse ver uma maneira pela qual você poderia chamar a estrutura na pergunta "composição da função", isso me parece um uso muito incomum do termo, em um sentido matemático.
David Z

2

Como @Karl Bielefeldt aponta, é chamado de composição de funções em matemática.

Não existe um termo técnico para isso na programação. E acho que isso é uma coisa boa, porque indica que a operação é normal e ortogonal .

Ortogonalidade nas linguagens de programação significa que você pode usar uma instrução / operação independente do seu contexto . Por exemplo, você pode chamar uma função / método das seguintes maneiras e se comportaria da mesma maneira ...

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

Você pode ler mais sobre ortogonalidade em programação na Wikipedia e há uma pergunta sobre StackOverflow sobre isso.


Não está indicando ortogonalidade, mas depende disso.
Raffael

+1, você está apenas passando valores, não há mágica na chamada do OP
vemv

1

Eu realmente não sou tão bom com termos, mas acabei de ler um artigo, há alguns dias, que se referia ao termo Funções de ordem superior , e aqui está um resumo da definição por Wikipedia:

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

Em matemática e ciências da computação, funções de ordem superior, formas funcionais ou funcionais são funções que executam pelo menos um dos seguintes procedimentos:

  • tome uma ou mais funções como entrada
  • emitir uma função

Todas as outras funções são de primeira ordem. Em matemática, funções de ordem superior também são conhecidas como operadores ou funcionais. A derivada no cálculo é um exemplo comum, pois mapeia uma função para outra função.

Portanto, nesse caso, como esse cenário tem pelo menos uma função como entrada / parâmetro, seria considerada uma função de ordem superior, acredito.


11
Não, chamar uma função de ordem superior seria semelhante func1(func2, func3). Observe o parêntese ausente.
Fredoverflow

isso faz sentido Fred. um é o endereço de uma função e o outro é o resultado da execução dessa função. Obrigado por apontar isso.
silverCORE
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.