Isso não é uma coisa ruim. Na verdade, é uma coisa muito boa.
A passagem de funções para funções é tão importante para a programação que inventamos funções lambda como abreviação. Por exemplo, pode-se usar lambdas com algoritmos C ++ para escrever de forma muito compacta ainda código expressivo que permite um algoritmo genérico a capacidade de usar variáveis locais e outro estado para fazer coisas como pesquisar e ordenar.
As bibliotecas orientadas a objetos também podem ter retornos de chamada , que são essencialmente interfaces que especificam um pequeno número de funções ( idealmente um, mas nem sempre). Pode-se então criar uma classe simples que implemente essa interface e passe um objeto dessa classe para uma função. Essa é uma pedra angular da programação orientada a eventos , onde o código no nível do framework (talvez até mesmo em outro segmento) precisa chamar em um objeto para mudar de estado em resposta a uma ação do usuário. A interface ActionListener do Java é um bom exemplo de isso.
Tecnicamente, um functor C ++ também é um tipo de objeto de retorno de chamada que aproveita o açúcar sintático, operator()()
, para fazer a mesma coisa.
Finalmente, há ponteiros de função no estilo C que só devem ser usados em C. Não vou entrar em detalhes, apenas menciono-os para completude. As outras abstrações mencionadas acima são muito superiores e devem ser usadas em idiomas que as possuam.
Outros mencionaram a programação funcional e como funções de passagem são muito naturais nessas linguagens. Lambdas e callbacks são a forma como as linguagens procedurais e OOP imitam isso, e são muito poderosas e úteis.