如何在idl中为DDS建模

时间:2013-03-11 11:53:01

标签: data-distribution-service

我是DDS和IDL的新手,我希望有人能就如何在IDL中建模以下内容提供一些建议。

这是基于OO角度的模型,它只是作为一个简单的例子: enter image description here

这是我在IDL中的初始数据模型 - 是否正确完成? 如何在IDL中“建模”继承和依赖?网上的很多例子都非常简单 - 我发现的很简单......

module test{
struct carpool{
    long id; //@key
    string name;
    sequence<car> cars;
};

struct car{
    long id; //@key
    string color;
};
////the following inherits from car
struct sedan{
    string extra_equipment;
};

struct station_car{
    integer number_of_doors;
};
};

这只是继承的示例,而且不是最好的; o)

这是正确的还是有更好的建模方法 - 任何人都可以提供一个好的“HOWTO”链接来使用IDL for DDS吗? 注意:我正在使用RTI Connext DDS

2 个答案:

答案 0 :(得分:2)

您的IDL有两个方面值得关注。

首先是继承机制,传统上DDS不支持,但现在凭借Extensible and Dynamic Topic Types规范。下面的代码段显示了如何使用它。但是,您是否确实需要该继承机制取决于您将如何使用该数据。您是否打算订阅基类car,还是只订阅派生类?在第一种情况下,您将需要真正的继承。在第二种情况下,您可以通过将汽车基础结构嵌入到所有派生汽车中来建模继承。

然后还有carpoolcar类之间的一对多关系问题。使用序列通常不是最好的方法。假设您将单车添加到carpool,那么整个carpool结构及其所有车辆都需要重新发布。这可能是您想要的,但通常情况下,最好使用car类上的“外键”来引用它所属的carpool。这很像常规数据库设计的工作方式。通过这种方法,应用程序负责通过carpoolId属性关联它们来重新构建汽车的完整拼车。然后通过carpool结构更新car。这确实需要car知道它所属的carpool

可能的示例摘录:

module test {

  struct carpool {
    long   id; //@key
    string name;
  };

  struct car {
    long   id; //@key
    long   carpoolId; // refers to carpool this car belongs to
    string color;
  };

  struct sedan : car {
    string extra_equipment;
  };

  struct station_car : car {
    integer number_of_doors;
  };
};

答案 1 :(得分:0)

新的DDS可扩展类型规范引入了对IDL中的结构继承的支持。如果您使用的是RTI Connext DDS 5.0.0或更高版本,则可以使用此功能。

语法为:

struct car {
    long id; //@key
    string color;
};

struct sedan : car {
    string extra_equipment;
};

struct station_car : car {
    integer number_of_doors;
};

等等......

了Gerardo