CORBA: Может ли тип CORBA IDL быть атрибутом другого? - PullRequest
1 голос
/ 23 августа 2010

Прежде чем я начну использовать CORBA, я хочу кое-что узнать.

Мне кажется, что вы можете использовать тип IDL в качестве атрибута другого, который затем предоставит методы этого атрибута клиентскому приложению.(также используя ".").

Но возможно ли это?

Например (извините, мой плохой IDL):

interface Car{ 
      attribute BrakePedal brakePedal; 
      //... 
}



//then.. (place above) 

interface BrakePedal{ 
      void press(); 
      //... 
} 

//... 

Затем в клиентском приложенииВы могли бы сделать: myCar.brakePedal.press();

CORBA выглядела бы дерьмово, если бы вы не могли делать такого рода многоуровневые объектные интерфейсы.В конце концов, объекты реального мира многоуровневые, верно?Так может ли кто-нибудь успокоить меня и подтвердить (или попробовать, если у вас уже установлен CORBA), если это определенно работает?Ни одна из документации IDL явно не показывает это в примере, поэтому я обеспокоен.Спасибо!

Ответы [ 2 ]

1 голос
/ 26 августа 2010

Объявление атрибута логически эквивалентно объявлению пары функций доступа, одна для чтения значения атрибута и одна для его записи (вы также можете иметь readonly атрибуты, в этом случае вы получите только чтение функция).

Это явствует из спецификации CORBA. что вы можете поместить имя интерфейса в качестве имени атрибута. Я попытался передать такой IDL в переводчик omniORB IDL в C ++, и он не отверг его. Поэтому я думаю, что это разрешено.

Но я действительно не уверен, что вы захотите сделать это на практике. Большинство экспертов CORBA рекомендуют, чтобы, если вы собираетесь использовать атрибуты, вы использовали только атрибуты readonly. А для чего-то подобного я бы просто объявил свою собственную функцию, которая возвращала интерфейс.

Обратите внимание, что вы все равно не можете использовать синтаксис, который вы хотите в отображении C ++; например,

server->brakePedal()->press();   // major resource leak here

brakePedal() - это функция доступа к атрибуту, которая возвращает ссылку на объект CORBA. Если вы немедленно вызовете press(), вы потеряете ссылку на объект.

Чтобы сделать это без утечки, вы должны сделать что-то вроде этого:

BrakePedal_var brakePedal(server->brakePedal());
brakePedal->press();

Вы просто не можете получить удобство обозначений, которое вы хотите от атрибутов в этом сценарии с отображением C ++ (возможно, вы могли бы в отображении Python). Из-за этого и из-за моей общей неприязни к атрибутам я бы просто использовал обычную функцию для возврата интерфейса BrakePedal.

0 голосов
/ 25 августа 2010

Вы не понимаете чего-то важного в распределенных объектах: удаленные объекты (независимо от того, реализованы ли они с помощью CORBA, RMI, .NET remoting или веб-сервисов) не являются такими же, как локальные объекты.Вызовы объектов CORBA являются дорогостоящими, медленными и могут не работать из-за проблем с сетью.Синтаксис object.attribute.method () затруднит понимание того, что в этой строке выполняются два различных удаленных вызова, и затруднит обработку любых возможных сбоев.

...