许多编程语言和框架都会/允许/需要一些我似乎无法找到名称的东西,即使计算机科学中可能存在一个。他们基本上做的是按名称绑定到变量/对象/类/函数。
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在代码完成,导航和重构方面无法提供帮助。但这不是重点。
我的问题是,这叫什么? 我不认为这是其中之一:dynamic binding,name binding,reflection
更新:不,这不是测验,对不起,如果听起来像是一个。这只是编程的“名字那首歌”。
更新:有帮助的答案:
更新:正如人们正确指出的那样,一些例子是后期绑定,一些是反射,一些是运行时评估(解释)等。但是,我的结论可能是没有描述它们的名称。这只是一堆具有共同点的例子,但还不足以给它起个名字。我喜欢“一切都是字符串”的答案,但即使它很有趣,它也不能完全正义。
答案 0 :(得分:15)
它被称为“后期绑定”,“动态绑定”或“运行时绑定”。它通过字符串绑定的事实只是一个实现细节,尽管它确实意味着字符串到符号的映射存在于运行时(某些语言,如c ++,不提供)。
另一方面,“反省”或“反射”指的是找出对象在运行时实现的接口,方法或属性的能力。确实,在执行之前无法验证动态绑定符号;这就是它们与静态绑定符号的不同之处。
答案 1 :(得分:7)
后期绑定
答案 2 :(得分:3)
是什么让你认为Class.forName
不是反映?
答案 3 :(得分:3)
反射
答案 4 :(得分:3)
如果它像普通的html一样工作,那么flex就可以称为后期绑定。在用户单击按钮之前,运行时无需查找函数是否存在。 第二件事是依赖注入,它涉及函数指针(通过接口)和反射。 java one肯定是反思。
我想你可能无法正确地提出你的问题或选择了不好的例子来说明你的想法。
答案 5 :(得分: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();
});
编译器确定属性是事件,样式还是属性,但由于这是在编译时完成的,因此它不是反射。根据定义,反射是在运行时完成的。
我认为可以说第二和第三个例子是反思,但它们也是后期约束的例子。它们实际上都没有确定它们所处理的对象的能力,因此它们不是反射。但是,我会说术语“反射”在广义上经常用于表示调用其名称在运行时确定的方法的任何内容,或者从仅在运行时命名的类创建对象。如果你想要精确的“后期绑定”可能是最正确的答案,但我认为“反思”已经足够了。
答案 6 :(得分:2)
后期绑定?
答案 7 :(得分:1)
“内省”?
答案 8 :(得分:1)
顺便说一下,我猜测你向我们展示的Flex代码只使用了ActionScript调用,在这种情况下,click
属性只是由Flex文档的解释器eval
来实现的。因此,这种代码背后没有特殊的魔力,它只是解释器的输入。
答案 9 :(得分:1)
我认为Flex示例与Java中的示例并不完全相同(不知道其他内容)。 Java示例显然是我称之为后期绑定的东西,因为类加载器在运行时解析了类名,这是最新的可能时间。
Flex MXML主要是另一种语法,最终会被编译为您也可以用ActionScript编写的语法。据我所知,mx:Button和selectAll()函数在编译时解析。如果在那里使用未定义的符号,至少mxmlc会出错。
答案 10 :(得分:1)
有一种情况,编译器可以帮助...代码生成。
答案 11 :(得分:1)
如果在运行时之前不知道变量的类型,那么它是后期绑定。如果变量类型在编译时已知,则它是早期绑定。
智能感知,代码完成以及您谈论的所有其他IDE功能仅适用于早期绑定变量。
答案 12 :(得分:1)
我称之为“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
答案 13 :(得分:0)
您提供的Java示例称为动态类加载。我不确定其他例子是否相同。但这在反思中很有用。也许您正在寻找名为Inversion of control的设计模式。
答案 14 :(得分:0)
闻起来像是指向我的函数指针。
答案 15 :(得分:0)
在.NET世界中,我们称之为数据绑定,并使用反射进行处理。
它也让我想起了依赖注入。
答案 16 :(得分:0)
第一个例子是命名空间的xml如何承担编译时间的意义的一个例子, 第二种是数据绑定/依赖注入 第三个例子是Reflection,如果我必须用名字标记所有这三个例子,我想我会选择“语法”