7

许多编程语言和框架确实/允许/需要一些我似乎找不到名称的东西,即使计算机科学中可能有一个。他们基本上做的是按名称绑定到变量/对象/类/函数。

弹性示例(“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

是什么让你认为这Class.forName不是反思?

于 2008-10-13T17:36:19.817 回答
3

反射

于 2008-10-13T17:37:46.850 回答
3

flex 的东西可以称为后期绑定,如果它像普通的 html 一样工作。在用户单击按钮之前,运行时不会费心查找函数是否存在。第二件事是依赖注入,它涉及函数指针(通过接口)和反射。java肯定是反射。

我想可能是你不能正确地表达你的问题,或者选择了不好的例子来说明你的想法。

于 2008-10-13T17:48:46.453 回答
2

后期绑定?

于 2008-10-13T17:37:07.193 回答
2

第二个和第三个例子是反射或后期绑定的例子,但第一个例子不是。

<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();
});

编译器确定属性是事件、样式还是属性,但由于这是在编译时完成的,因此它不是反射。根据定义,反射是在运行时完成的。

我认为可以说第二个和第三个示例是反射,但也可以说它们是后期绑定的示例。它们中没有一个实际上决定了它们所处理的对象的能力,因此它们不是反射。但是,我会说“反射”一词通常在广义上用于表示调用名称在运行时确定的方法或从仅在运行时命名的类创建对象的任何事物。如果要精确,“后期绑定”可能是最正确的答案,但我认为“反思”已经足够了。

于 2008-10-19T13:41:50.300 回答
1

“内省”?

于 2008-10-13T17:44:10.003 回答
1

顺便说一句,我推测您向我们展示的 Flex 代码仅使用 ActionScript 调用,在这种情况下,该click属性将由evalFlex 文档的解释器简单地 'd'。因此,这种代码背后没有什么特别的魔力,它只是解释器的输入。

于 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

如果直到运行时才知道变量的类型,那么它就是后期绑定。如果变量类型在编译时已知,那么它就是早期绑定。

Intellisense、代码完成和您谈论的所有其他 IDE 功能仅适用于早期绑定变量。

于 2008-10-13T18:50:31.913 回答
0

在 .NET 世界中,我们称之为数据绑定,它使用反射进行处理。

它也让我强烈地想起了依赖注入。

于 2008-10-13T17:39:37.500 回答
0

闻起来像一个指向我的函数指针。

于 2008-10-13T17:40:29.653 回答
0

您提供的 Java 示例称为动态类加载。我不确定其他示例是否相同。但这在反思中很有用。也许您正在寻找称为控制反转的设计模式。

于 2008-10-13T17:42:25.653 回答
0

第一个示例是一个命名空间 xml 如何在编译时假设含义的示例,第二个是数据绑定/依赖注入第三个示例是反射,如果我必须用一个名称标记所有这 3 个示例,我想我会去对于“语法”

于 2008-10-13T17:57:18.883 回答