7

多くのプログラミング言語とフレームワークは、名前が見つからないように見える何かを行う/許可する/必要とします。彼らが基本的に行うことは、変数/オブジェクト/クラス/関数に名前でバインドすることです。

Flexの例 ("selectAll()"):

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

メイトの例 (「価格」):

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

Java の例 ("Foo"):

Class.forName("Foo")

他にもたくさんの例があります。あなたはアイデアを得る。私が困っているのは、コンパイル時にこれを検証する方法が事実上なく、IDE がコード補完、ナビゲーション、およびリファクタリングに関してできることはほとんどないことです。しかし、それは重要なことではありません。

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

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

更新:役に立った回答:

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

更新: 人々が正しく指摘したように、いくつかの例は遅延バインディングであり、いくつかはリフレクションであり、いくつかは実行時評価 (解釈) などです。ただし、それらすべてを説明する名前はおそらくないと結論付けています。これは共通点のある例の集まりにすぎませんが、名前を付けるには不十分です。「すべてが文字列である」という答えが気に入りましたが、面白いとはいえ、完全に正しいとは言えません。

4

17 に答える 17

15

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

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

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

于 2008-10-13T17:56:10.197 に答える
7

遅延バインディング

于 2008-10-13T17:37:45.447 に答える
3

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

質問を適切に表現できなかったか、考えを説明するために悪い例を選んだ可能性があります。

于 2008-10-13T17:48:46.453 に答える
3

Class.forNameそれが反省ではないと思う理由は何ですか?

于 2008-10-13T17:36:19.817 に答える
3

反射

于 2008-10-13T17:37:46.850 に答える
2

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

于 2008-10-19T13:41:50.300 に答える
2

バインディングが遅い?

于 2008-10-13T17:37:07.193 に答える
1

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

インテリセンス、コード補完、およびあなたが話している他のすべての IDE 機能は、事前にバインドされた変数でのみ使用できます。

于 2008-10-13T18:50:31.913 に答える
1

「内省」?

于 2008-10-13T17:44:10.003 に答える
1

ところで、あなたが示した Flex コードは単純に ActionScript 呼び出しを使用していると思います。その場合、click属性はevalFlex ドキュメントのインタープリターによって単純に指定されます。したがって、この種のコードの背後にある特別な魔法はなく、単にインタープリターへの入力です。

于 2008-10-13T17:55:50.883 に答える
1

Flex の例は、Java のものとまったく同じではないと思います (他のことはわかりません)。Java の例は明らかに私が遅延バインディングと呼ぶものです。これは、クラスローダーが実行時にクラス名を解決するためです。

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

于 2008-10-13T17:57:19.073 に答える
1

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

于 2008-10-13T18:23:57.770 に答える
1

私はそれを「すべてが文字列である」、「Universal Data Type としての文字列」、または「文字列の乱用」と呼んでいます。

サポート:

http://research.microsoft.com/~emeijer/papers/xml2003/xml2003.html

http://blog.moertel.com/articles/2006/10/18/a-type-based-solution-to-the-strings-problem

http://pveentjer.wordpress.com/2006/10/11/string-is-not-a-good-universal-datatype/

http://computer-programming-languages.suite101.com/article.cfm/abused_strings_considered_harmful

于 2008-10-13T20:33:33.780 に答える
0

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

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

于 2008-10-13T17:39:37.500 に答える
0

私への関数ポインタのようなにおいがします。

于 2008-10-13T17:40:29.653 に答える
0

あなたが示した Java の例は、Dynamic Class Loading と呼ばれます。他の例が同じかどうかはわかりません。しかし、これは振り返りに役立ちます。Inversion of control と呼ばれる設計パターンを探しているのかもしれません。

于 2008-10-13T17:42:25.653 に答える
0

最初の例は、名前空間化された xml がコンパイル時にどのように意味を持つかの例です。2 番目の例は、データバインディング/依存性注入の両方です。3 番目の例は、リフレクションです。この 3 つの例すべてに名前を付ける必要がある場合、私は行くと思います。 「構文」について

于 2008-10-13T17:57:18.883 に答える