许多编程语言和框架都允许/需要一些我似乎找不到名字的东西,尽管计算机科学中可能有这样的名字。它们基本上是通过名称绑定到变量/对象/类/函数。
弹性示例("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:它只是一个解释器的输入
Update:正如人们正确指出的,有些示例是后期绑定,有些是反射,有些是运行时评估(解释),等等。然而,我得出的结论是,可能没有一个名称可以描述所有这些示例。这只是一堆有共同点的例子,但还不足以给它一个名字。我喜欢"一切都是一串"的答案,但即使它很有趣,也不能完全公正。
它被称为"后期绑定"、"动态绑定"或"运行时绑定"。它通过字符串绑定的事实只是一个实现细节,尽管这确实意味着字符串到符号的映射在运行时存在(有些语言,如c++,没有提供)。
另一方面,"反思"或"反射"指的是找出对象在运行时实现的接口、方法或属性的能力。
的确,动态绑定的符号在执行之前无法进行验证;这就是它们与静态绑定符号不同的地方。
后期绑定
是什么让你认为Class.forName
不是反射?
反射
如果flex像普通html一样工作,那么它可以被称为后期绑定。在用户单击按钮之前,运行时不会费力地查找函数是否存在。第二件事是依赖注入,它涉及函数指针(通过接口)和反射。java肯定是反射。
我想可能是你没有正确地表达你的问题,或者选择了不好的例子来说明你的想法。
延迟绑定?
第二个和第三个例子是反射或后期绑定的例子,但第一个例子不是。
<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();
});
编译器确定属性是事件、样式还是属性,但由于这是在编译时完成的,因此不是反射。根据定义,反射是在运行时完成的。
我认为可以说,第二个和第三个例子是反思,但它们也是后期约束的例子。它们中没有一个真正决定了它们所处理对象的功能,因此它们不是反射。然而,我想说的是,"反射"一词在广义上经常用来指调用名称在运行时确定的方法,或从仅在运行时命名的类中创建对象的任何东西。如果你想精确地说,"后期装订"可能是最正确的答案,但我认为"反思"就足够了。
"内省"?
顺便说一句,我推测您向我们展示的Flex代码只使用ActionScript调用,在这种情况下,Flex文档的解释器只会将click
属性设置为eval
'd。因此,这种代码背后并没有什么特殊的魔力,它只是为解释器输入的。
我认为Flex示例与Java中的示例不太一样(不知道其他内容)。Java示例显然是我称之为后期绑定的东西,因为类加载器在运行时解析类名,这是最晚可能的时间。
Flex MXML主要是另一种语法,它最终被编译成您也可以用ActionScript编写的东西。据我所知,mx:Button和selectAll()函数是在编译时解析的。如果您在mxmlc中使用未定义的符号,那么它至少会给出错误。
有一种情况下编译器可以帮助实现。。。代码生成。
如果变量的类型直到运行时才知道,那么它是后期绑定。如果变量类型在编译时是已知的,那么它是早期绑定。
Intellisense、代码完成和您谈论的所有其他IDE功能仅在早期绑定变量上可用。
我称之为"Everything is a String"、"String as Universal Data Type"或"String Abuse"。
支持:
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
闻起来像是指向我的函数指针。我不确定其他的例子是否是一样的。但这在反思中是有用的。也许你正在寻找一种叫做控制反转的设计模式。
在.NET世界中,我们称之为数据绑定,它使用反射进行处理。
这也让我强烈地想起了依赖注入。
第一个例子是一个名称空间xml如何在编译时具有意义的例子,第二种是数据绑定/依赖性注入第三个例子是Reflection,如果我必须用一个名字标记这三个例子,我想我会选择"Syntax"