Как моделировать в idl для DDS

Я новичок в DDS и IDL, и я надеюсь, что кто-то может дать несколько советов о том, как смоделировать следующее в IDL.

Это основано на модели с точки зрения ОО, и это просто в качестве быстрого примера:введите описание изображения здесь

И это моя исходная модель в 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;
};
};

Это просто выдуманный пример наследования, и, собственно, не самый лучший; о)

Это правильно или есть лучший способ моделирования - кто-нибудь может дать ссылку на хороший "HOWTO" для работы с IDL для DDS? Примечание: я работаю с RTI Connext DDS

2 ответа

Решение

Есть два аспекта в вашем IDL, которые заслуживают некоторого внимания.

Во-первых, это механизм наследования, который традиционно не поддерживался DDS, но теперь благодаря спецификации Extensible и Dynamic Topic Types. Фрагмент ниже показывает, как это использовать. Однако, действительно ли вам нужен этот механизм наследования, зависит от того, как вы собираетесь использовать данные. Вы когда-нибудь намереваетесь подписаться на базовый класс? car, или вы будете подписываться только на производные классы? В первом случае вам понадобится истинное наследство. Во втором случае вы можете моделировать наследование путем встраивания базовой конструкции автомобиля во все производные автомобили.

Тогда есть также вопрос ваших отношений один-ко-многим между carpool а также car классы. Использование последовательности, как правило, не лучший подход. Предположим, что вы добавляете одну машину к вашему 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;
  };
};

В новой спецификации DDS Extensible Type появилась поддержка наследования структур в 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;
};

И так далее...

Херардо

Другие вопросы по тегам