2010-08-23 2 views
1

Прежде чем я начну использовать CORBA, я хочу кое-что знать.CORBA: Может ли тип CORBA IDL быть атрибутом другого?

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

Но разве это возможно?

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

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



//then.. (place above) 

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

//... 

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

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

ответ

1

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

Это похоже на спецификацию CORBA. что вы можете поместить имя интерфейса в качестве имени атрибута. Я пытался подавать такой IDL на IDL omniORB в 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

Я думаю, что вы просто не понимаете атрибутов. Атрибуты - короткие руки для функций. В этом случае вы вызываете функцию «читать». Вызов второго уровня происходит на стороне клиента. Сервер полностью не осознает, что вы это сделаете, когда сделаете атрибут «читать», поэтому его нельзя «оптимизировать». Он не знает, что вы собираетесь делать с этой ссылкой на объект. Нет, я не думаю, что мы увидим новую, большую версию CORBA. Он используется только в нескольких специализированных нишевых приложениях и устаревших приложениях прямо сейчас. –

0

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

+0

О, очень интересно, спасибо! За исключением того, что я намереваюсь использовать его исключительно в локальной системе (для нового аппаратного устройства для взаимодействия с сторонними приложениями, которые хотят поддерживать его на одном и том же настольном компьютере, независимо от платформы/языка). Является ли это еще определенным?(Извините мою немощь в чтении вашего сообщения, но я не уверен, что вы говорите, что это было бы нежелательно в сетях или если это действительно невозможно с IDL). – Navigateur

+0

Этот ответ должен быть комментарием, поскольку вы не отвечаете на вопрос. Вся идея RPC заключается в том, чтобы сделать его похожим на локальный. –

Смежные вопросы