CORBA: Может ли тип CORBA IDL быть атрибутом другого?

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

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

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

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

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



//then.. (place above) 

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

//... 

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

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


person Navigateur    schedule 23.08.2010    source источник


Ответы (2)


Объявление атрибута логически эквивалентно объявлению пары функций доступа, одна для чтения значения атрибута, а другая для его записи (у вас также может быть 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.

person Brian Neal    schedule 26.08.2010
comment
Я думаю, вы просто не понимаете атрибуты. Атрибуты — это сокращение от функций. В этом случае вы вызываете функцию чтения. Вызов второго уровня происходит на стороне клиента. Сервер совершенно не знает, что вы собираетесь сделать это, когда выполняете вызов чтения атрибута, поэтому его нельзя оптимизировать. Он понятия не имеет, что вы собираетесь делать с этой ссылкой на объект. Нет, я не думаю, что мы увидим новую основную версию CORBA. Сейчас он используется только в нескольких специализированных нишевых приложениях и устаревших приложениях. - person Brian Neal; 26.08.2010

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

person bithead61    schedule 25.08.2010
comment
О, очень интересно, спасибо! За исключением того, что я намереваюсь использовать его исключительно в локальной системе (для нового аппаратного устройства для взаимодействия со сторонними приложениями, которые хотят поддерживать его на том же настольном компьютере, независимо от платформы/языка). Это все еще определенное нет?? (Извините за глупость при чтении вашего сообщения, но я не уверен, говорите ли вы, что это было бы нежелательно в сетях, или это на самом деле ТЕХНИЧЕСКИ невозможно с IDL). - person Navigateur; 25.08.2010
comment
Этот ответ должен быть комментарием, так как вы не отвечаете на вопрос. Вся идея RPC состоит в том, чтобы сделать его похожим на локальный вызов. - person Brian Neal; 26.08.2010