質問

多くのプログラミング言語とフレームワークは、コンピュータサイエンスにおそらくあるものの、名前を見つけることができないようなものを許可/要求します。基本的には、名前で変数/オブジェクト/クラス/関数にバインドします。

Flex の例(" selectAll()"):

<mx:Button click="selectAll()" label="Select All"/>

メイトの例(&quot; price&quot;):

<Injectors target="{QuotePanel}">
  <PropertyInjector targetKey="price" source="{QuoteManager}" sourceKey="currentPrice" />
</Injectors>

Javaの例(&quot; Foo&quot;):

Class.forName("Foo")

他にも多くの例があります。あなたはアイデアを得る。私が困っているのは、コンパイル時にこれを事実上確認する方法がなく、コード補完、ナビゲーション、リファクタリングの面でIDEができることはあまりないことです。しかし、それはポイントの外です。

私の質問は、これは何と呼ばれていますか? 動的バインディング名前バインディングリフレクション

更新:いいえ、これはクイズではありません。それは単に「その曲に名前を付ける」だけの問題です。プログラミング用。

更新:助けた回答:

  • Tim Lesherから:「遅延バインディング」、「動的バインディング」、または「ランタイムバインディング」と呼ばれます。 文字列でバインドするという事実は、実装の詳細にすぎません ...
  • Konrad Rudolphから:... これは単にインタプリタへの入力です。

更新:人々が正しく指摘しているように、いくつかの例は遅延バインディングであり、いくつかはリフレクションであり、いくつかは実行時評価(解釈)などです。しかし、おそらくないそれらすべてを説明する名前。それは単なる共通点を持っているが、名前を与えるのに十分ではない単なる例の束です。 「すべてが文字列です」が好きだった答えてください。しかし、それはおもしろいのですが、それは完全に正義を行うわけでもありません。

役に立ちましたか?

解決

「遅延バインディング」、「動的バインディング」、または「ランタイムバインディング」と呼ばれます。文字列でバインドするという事実は実装の詳細にすぎませんが、実行時に文字列からシンボルへのマッピングが存在することを意味します(c ++などの一部の言語では提供されません)。

&quot;イントロスペクション&quot;一方、「リフレクション」は、オブジェクトが実行時に実装するインターフェース、メソッド、または属性を見つける機能を指します。

実行前に動的にバインドされたシンボルを検証できないことは事実です。それが、静的にバインドされたシンボルと異なる点です。

他のヒント

遅延バインディング

Class.forName はリフレクションではないと思うのはなぜですか?

反射

フレックスは、通常のhtmlのように機能する場合、遅延バインディングと呼ぶことができます。ユーザーがボタンをクリックするまで、ランタイムはわざわざ関数が存在するかどうかを見つけません。 2つ目は、依存関係の注入です。これには、関数ポインター(インターフェイス経由)とリフレクションが含まれます。 Javaのものは間違いなくリフレクションです。

質問を適切に表現できなかったか、考えを説明するために悪い例を選んだかもしれません。

遅延バインディング?

2番目と3番目の例はリフレクションまたは遅延バインディングの例ですが、最初の例はそうではありません。

<mx:Button click="selectAll()" label="Select All"/>

コンパイル前にActionScriptとして書き換えられ、 selectAll()部分がイベントハンドラー関数内に組み込まれます。次のようなもの(どのように実行されるかは、コンパイラフラグに -keep-generated-actionscript を追加することで確認できます):

_button1 = new Button();
_button1.label = "Select All";
_button1.addEventListener("click", function( event : Event ) : void {
    selectAll();
});

コンパイラは、属性がイベント、スタイル、またはプロパティであるかどうかを判断しますが、これはコンパイル時に行われるため、反映されません。定義により、反射は実行時に行われます。

2番目と3番目の例はリフレクションであるだけでなく、遅延バインディングの例でもあると主張できると思います。それらのどれもが実際にそれらが動作するオブジェクトの能力を決定しないので、そのようにそれらは反射ではありません。ただし、「リフレクション」という用語は、は、実行時に名前が決定されるメソッドを呼び出すもの、または実行時にのみ名前が付けられたクラスからオブジェクトを作成するものを意味するために、広い意味で非常によく使用されます。正確に「遅延バインディング」したい場合おそらく最も正しい答えですが、「反射」と思います。十分です。

&quot;イントロスペクション&quot;

ところで、お見せしたFlexコードは単にActionScript呼び出しを使用していると推測します。この場合、 click 属性はインタープリターによって eval 'dされますFlexドキュメントのしたがって、この種のコードの背後には特別な魔法はありません。インタープリターへの入力にすぎません。

Flexの例はJavaの例とまったく同じではないと思います(他のことは知りません)。 Javaの例は明らかに late binding と呼ばれるものです。クラスローダーが実行時にクラス名を解決するためです。

Flex MXMLは主に別の構文であり、最終的にはActionScriptでも記述できるものにコンパイルされます。私が知る限り、mx:ButtonおよびselectAll()関数はコンパイル時に解決されます。未定義のシンボルを使用すると、少なくともmxmlcでエラーが発生します。

コンパイラがこれを支援できるシナリオがあります...コード生成。

変数のタイプが実行時までわからない場合は、遅延バインディングです。コンパイル時に変数の型がわかっている場合は、事前バインディングです。

インテリセンス、コード補完、その他のすべてのIDE機能は、アーリーバインド変数でのみ利用可能です。

私への関数ポインタのような匂い。

指定したJavaの例は、ダイナミッククラスロードと呼ばれます。他の例が同じものかどうかはわかりません。しかし、これはリフレクションには役立ちます。制御の反転と呼ばれる設計パターンを探しているのかもしれません。

.NETの世界では、このデータバインディングを呼び出し、リフレクションを使用して処理しました。

また、依存性注入を強く思い出させます。

最初の例は、名前空間付きxmlがコンパイル時に意味をどのように想定できるかの例です。 2番目は、データバインディング/依存関係の注入です。 3番目の例はリフレクションです。この3つの例すべてに名前をタグ付けする必要があった場合、「構文」に進むと思います

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top