在计算机科学中,这被称为什么?

7
许多编程语言和框架都会/允许/需要一种我无法找到计算机科学中的名称的操作。它们基本上是通过名称绑定到变量/对象/类/函数。
例如,Flex 中的示例("selectAll()"):
<mx:Button click="selectAll()" label="Select All"/>

Mate示例(“价格”):

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

Java示例(“Foo”):

Class.forName("Foo")

有许多其他的例子。你明白了我的意思。困扰我的是,几乎没有办法在编译时验证它,而且IDE在代码完成、导航和重构方面也无法提供太多帮助。但这不是重点。
我的问题是,这叫什么?我不认为它是其中之一:动态绑定名称绑定反射 更新:不,这不是一场测验,如果听起来像是一场测验,我很抱歉。对于编程,这只是一个“给它命名”的问题。
更新:有用的答案:
从Tim Lesher:它被称为“后期绑定”、“动态绑定”或“运行时绑定”。事实上,它通过字符串进行绑定只是一种实现细节...
从Konrad Rudolph:...它只是解释器的输入。
更新:正如人们正确指出的那样,某些示例是后期绑定,某些示例是反射,某些示例是运行时评估(解释),等等。然而,我得出结论,可能没有一个名称可以描述它们所有。这只是一堆有共同点的例子,但不足以给它一个名称。我喜欢“一切都是字符串”的答案,但即使它很有趣,也不能完全说明问题。

也许您可以解释一下为什么您不喜欢动态或后期绑定这些术语。这就是我会称呼它们的方式。 - Michael Burr
动态/晚期绑定似乎与多态有关,具体来说是决定调用哪个方法。你说得对,它是其中的一部分,但似乎没有完全抓住重点,因为我正在寻找的东西也用于设置属性,而不仅仅是调用方法/函数。 - thvo
术语“动态绑定”和“晚期绑定”自上世纪80年代初我还是一个大学年轻人的时候就已经广泛使用了。它们可能被面向对象编程群体用来描述多态性,但对于你所说的用途,它们肯定早就存在了。 - Michael Burr
1
我在想,如果我发布另一个带有“晚期绑定”的答案,是否会得到更多的投票? - Tomalak
17个回答

15

这被称为“晚绑定”,“动态绑定”或“运行时绑定”。它通过字符串绑定只是一种实现细节,尽管它暗示着在运行时存在字符串到符号的映射(某些语言,如c++不提供)。

另一方面,“内省”或“反射”指的是在运行时查找对象实现的接口、方法或属性的能力。

确实,动态绑定的符号在执行前无法验证,这就是它们与静态绑定符号的不同之处。


7

延迟绑定


3
你认为什么让你觉得Class.forName不是反射?

是的,Java示例确实使用了反射技术,而其他示例可能在底层使用了反射技术来实现,但我要找的词并不是“反射”。 - thvo
不好意思,我真的不知道答案。如果这似乎像一次测验,那我向你道歉。 - thvo

3

反射


3
弹性布局的特点就是迟绑定,如果它像普通的HTML一样工作。在用户点击按钮之前,运行时不会去查找函数是否存在。 第二个是依赖注入,涉及到函数指针(通过接口)和反射。 Java中肯定是反射。 我认为你可能没有恰当地表达你的问题或选择了不好的例子来说明你的想法。

你说得对,提出问题并找到例子很重要。也许这个词不存在。 - thvo
{flex/html}运行时甚至不关心尝试查找selectAll函数。参数被扩展为onclick=eval("function(){selectAll();}"),也就是说,它是后期编译的。 - Javier

2
迟绑定?

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

编译器确定属性是事件、样式还是属性,但由于这是在编译时完成的,因此它不是反射。按照定义,反射是在运行时完成的。
我认为可以说第二个和第三个示例是反射,但也可以说它们是晚期绑定的示例。它们都没有确定它们所处理的对象的能力,因此在这方面它们不是反射。然而,我认为术语“反射”经常被广泛地用来指任何调用方法的东西,这些方法的名称是在运行时确定的,或者从仅在运行时命名的类创建对象。如果你想要精确,“晚期绑定”可能是最正确的答案,但我认为“反射”已经足够好了。

1

什么是"内省"?


1
顺便说一下,我猜测你展示给我们的 Flex 代码仅使用了 ActionScript 调用,这种情况下 click 属性将会被 Flex 文档的解释器简单地 eval。因此,这种代码并没有特别神奇的地方,它只是解释器的输入。

实际上它并不是在解释/评估,而是在编译时重写。 - Theo

1

我认为Flex示例与Java中的示例不太相同(不知道其他的东西)。Java示例显然是我所谓的后期绑定,因为类加载器在运行时解析类名,这是最晚的可能时间。

Flex MXML主要是另一种语法,最终编译成一些你也可以用ActionScript编写的东西。据我所知,mx:Button和selectAll()函数是在编译时解析的。至少mxmlc会在那里使用未定义的符号时给出错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接