最近、私はC ++について同僚と話していて、クラスフィールドの名前の文字列を取得して、その名前のフィールドを抽出する方法がないことを嘆きました。言い換えれば、それは反射を欠いています。彼は私に困惑した表情を見せ、いつ誰かがそのようなことをする必要があるのかと尋ねました。
頭のてっぺんから、「ねえ、今すぐやる必要がある」以外は、彼に良い答えはありませんでした。そこで私は座って、さまざまな言語でのリフレクションで実際に行ったことのいくつかのリストを思いつきました。残念ながら、私の例のほとんどはPythonでのWebプログラミングからのものであり、ここの人々がもっと多くの例を持っていることを望んでいました。これが私が思いついたリストです:
x = "Hello World!"のような行を含む構成ファイルがあるとします。
y = 5.0
は、あるオブジェクトのフィールドをconfig
そのファイルの値と等しく設定します。(これは、C ++で実行できることを望んでいましたが、実際には実行できませんでした。)オブジェクトのリストを並べ替えるときは、構成ファイルまたはWeb要求からの属性の名前を指定して、任意の属性に基づいて並べ替えます。
ネットワークプロトコルを使用するソフトウェアを作成する場合、リフレクションを使用すると、そのプロトコルの文字列値に基づいてメソッドを呼び出すことができます。たとえば
!some_command arg1 arg2
、メソッド呼び出しに変換して、actions.some_command(arg1, arg2)
その関数がIRCチャネルに返すものをすべて出力するIRCボットを作成しました。Pythonの__getattr__関数(Ruby / Smalltalkのmethod_missingのようなもの)を使用するとき、私はlate_totalなどの統計がたくさんあるクラスで作業していました。すべての統計について、_percentを追加して、カウントしている合計値のパーセンテージとしてその統計を取得できるようにしたかった(たとえば、stats.late_total_percent)。リフレクションはこれを非常に簡単にしました。
それで、ここの誰かが、振り返りが役に立ったときの彼ら自身のプログラミング経験からの例を与えることができますか?次回、同僚から「そんなことをしたい」と聞かれたときは、もっと準備をしていきたいと思います。