これは悪いことではありません。実際、それは非常に良いことです。
関数に関数を渡すことはプログラミングにとって非常に重要であるため、短縮形としてラムダ関数を発明しました。たとえば、C ++アルゴリズムでラムダを使用して、非常にコンパクトでありながら表現力のあるコードを記述し、汎用アルゴリズムがローカル変数やその他の状態を使用して検索や並べ替えなどを行えるようにします。
また、オブジェクト指向ライブラリには、本質的に少数の関数(理想的には1つですが、常にではない)を指定するインターフェイスであるコールバックがあります。次に、そのインターフェイスを実装する単純なクラスを作成し、そのクラスのオブジェクトを関数に渡すことができます。これは、イベント駆動型プログラミングの基礎であり、フレームワークレベルのコード(おそらく別のスレッドでも)は、ユーザーアクションに応答して状態を変更するためにオブジェクトを呼び出す必要があります。JavaのActionListenerインターフェイスは、この良い例です。
技術的には、C ++ファンクターはoperator()()
、同じことを行うために構文シュガーを活用する一種のコールバックオブジェクトでもあります。
最後に、Cスタイルの関数ポインターがありますが、これはCでのみ使用する必要があります。詳細については説明しませんが、完全を期すために言及しています。上記の他の抽象化ははるかに優れており、それらを含む言語で使用する必要があります。
他の人は、関数型プログラミングと、それらの言語で関数を渡すことが非常に自然であることに言及しています。ラムダとコールバックは、手続き型言語とOOP言語がそれを模倣する方法であり、非常に強力で便利です。