我正在研究在OMG的IDL中形式化的接口的验证,并且在获取属性值的语义上找到确定答案时遇到了问题。在界面中,我有一个条目......
interface MyInterface {
readonly attribute SomeType someName;
};
我需要知道someObj.someName != someObj.someName
是否可以接受(someObj
是实现MyInterface
的对象的实例)。
我在OMG文档中找到的关于属性的所有内容都是......
(5.14)属性定义在逻辑上等同于声明a 一对存取功能;一个用于检索属性的值 和一个设置属性的值。
...
可选的readonly关键字表示只有一个 访问函数 - 检索值函数。
因此,我不得不得出结论,IDL属性不需要由数据成员支持,并且可以自由地返回接口认为合适的任何值。任何有IDL经验的人都可以证实确实如此吗?
答案 0 :(得分:2)
众所周知,IDL 接口始终由远程对象表示。 属性不再是 getAttributeName()和 setAttributeName()的合成糖。就个人而言,我不喜欢使用属性因为它很难理解而不是简单的get / set方法。
CORBA也有值类型,按值结构 - 更好地解释here。它们非常有用,因为与struct不同,允许我们继承其他 valuetypes ,抽象接口或抽象valuetype 。 Usualy,当我用很多东西建模物体时 get / set方法我更喜欢使用valuetypes而不是 interfaces 。
回到你的问题,理解'属性'的最好方法是寻找C#。 IIOP.NET将“属性”映射到properties。属性模拟公共成员,但它们是get / set方法。
回答你的问题,我不知道someObj.someName != someObj.someName
在没有看到someObj实现的情况下是返回true还是false。我将添加两个例子来说明我们能看到的内容。
示例1)对于上面的表达式,此实现将始终返回false:
private static i;
public string getSomeName() {
return "myName" i;
}
示例2)此实现可以返回true或false,具体取决于客户端之间的并发性或“竞争条件”。
public string getSomeName() {
return this.someName;
}
public setSomeName(string name) {
this.someName = name;
}
第一个客户端可以尝试访问someObj.someName() != someObj.someName()
。第二个客户端可以在第一个客户端的第二次调用之前调用setSomeName()。
答案 1 :(得分:1)
通常,属性不需要由服务器上的任何数据成员支持,尽管某些语言映射可能会强加此类约定。
因此,在一般情况下,可能会发生someObj.someName!= someObj.someName。例如,属性可能是最后访问时间。
答案 2 :(得分:1)
someObj.someName != someObj.someName
完全可以接受,这看起来很奇怪。
原因(正如其他人所提到的)是因为属性映射到真正的RPC函数。在readonly
属性的情况下,它们只映射到setter,对于非readonly属性,在编译IDL时会隐式为您创建一个setter和getter。但重要的是要知道 IDL属性具有动态的,服务器指示的,RPC驱动的值。
IDL指定分布式交互的合同,可以在运行时在独立的,分离的实体之间进行。几乎每次与基于IDL的类型的交互都将导致RPC调用,并且任何返回值将取决于服务器决定返回的内容。
如果属性是,例如currentTime
那么您可能会在每次检索值时获得服务器的当前时钟时间。在这种情况下,someObj.currentTime != someObj.currentTime
很可能永远为真(假设使用的时间粒度小于两次RPC调用的组合往返时间)。
如果该属性改为currentBankBalance
,那么您仍然可以someObj.currentBankBalance != someObj.currentBankBalance
为真,因为可能有其他客户端在其他地方运行,并且通过setter函数不断修改属性,因此您正在处理也有竞争条件。
所有这一切,如果您非常正式地查看IDL规范,它不包含实际上要求设置/访问属性应该导致对服务器的RPC调用的语言。它可以由客户端ORB提供。事实上,这是一些ORB供应商在CORBA全盛时期利用的东西。我曾经在Orbix ORB上工作,我们有一个名为Smart Proxies的功能 - 允许应用程序开发人员重载ORB提供的默认客户端代理(它总是将所有属性调用转发给托管目标对象的服务器)具有自定义功能(例如,缓存属性值并返回本地副本而不会产生网络或服务器开销)。
总之,您需要非常清楚和准确地了解您正在尝试正式验证的内容。鉴于它们可以返回的值的动态和非确定性(以及客户端ORB可能表现出彼此不同并且仍然符合CORBA规范的事实)您只能可靠地期望IDL属性映射到getter和可用于检索或设置值的setter 。对于返回的实际值,根本没有可预测性。