OMG IDL属性的语义

时间:2012-02-20 17:41:02

标签: corba idl

我正在研究在OMG的IDL中形式化的接口的验证,并且在获取属性值的语义上找到确定答案时遇到了问题。在界面中,我有一个条目......

interface MyInterface {
  readonly attribute SomeType someName;
};

我需要知道someObj.someName != someObj.someName是否可以接受(someObj是实现MyInterface的对象的实例)。

我在OMG文档中找到的关于属性的所有内容都是......

  

(5.14)属性定义在逻辑上等同于声明a   一对存取功能;一个用于检索属性的值   和一个设置属性的值。

     

...

     

可选的readonly关键字表示只有一个   访问函数 - 检索值函数。

因此,我不得不得出结论,IDL属性不需要由数据成员支持,并且可以自由地返回接口认为合适的任何值。任何有IDL经验的人都可以证实确实如此吗?

3 个答案:

答案 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 。对于返回的实际值,根本没有可预测性。