【问题标题】:How to model in idl for DDS如何在 idl 中为 DDS 建模
【发布时间】:2013-03-11 11:53:00
【问题描述】:

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

这是基于 OO 角度的模型,它只是作为一个简单的示例:

这是我在 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

【问题讨论】:

  • 好问题——如果我能更好地理解继承树的确切意图,我会回答。在您的模型中,派生类 ToyotaMazda 的用途尚不清楚。为什么不将model 属性移到Car 类中?如果这样做,则不再需要 ToyotaMazda(从数据分发的角度来看)。还是您没有展示完整的数据模型,是否还有其他属性或类?
  • 上面的代码只是一个虚构的示例继承,并不是最好的——我已经编辑了一点,希望它现在更有意义。总的来说,我只是想更好地理解 IDL 以及如何采用 OO 模型并将其“翻译”成 IDL。我现在没有实际的模型 - 只是想更好地了解 DDS 和 IDL。

标签: data-distribution-service


【解决方案1】:

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

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

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

可能的例子sn-p:

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;
  };
};

【讨论】:

    【解决方案2】:

    新的 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;
    };
    

    等等……

    杰拉尔多

    【讨论】:

      猜你喜欢
      • 2021-06-01
      • 2021-04-23
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 2018-04-07
      • 2011-02-19
      相关资源
      最近更新 更多