Технология CORBA и особенности проектирования баз данных

Информация - Компьютеры, программирование

Другие материалы по предмету Компьютеры, программирование

В·ования строк: один вариант - в классическом стиле C++, другой - с использованием _var-класса CORBA.

Стиль C++:

f(char* Stringarg1, char* Stringarg2)

{* str = new char[strlen(Stringarg1) + 1];(str, Stringarg);

...

// утечка памяти= new char[strlen(Stringarg2) + 1];(str, Stringarg2);[] str; // не забудьте вызвать явно!

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

Следующая проблема гораздо более серьезна - вы должны освободить явно выделенную динамическую память, т.е. вызвать операцию delete.

Программистам на C++ хорошо известны различные приемы, которые позволяют решить данную проблему - например, использование классов auto_ptr<> и string из STL. Поскольку идея во всех таких подходах одна - завернуть указатель на защищаемый ресурс в некоторую оболочку, которая и выполняет все необходимые действия - то компилятор idl2cpp просто генерирует такую оболочку. Это и есть _var-класс. Имейте в виду - _var-классы способны управлять различными ресурсами, а не обязательно памятью. Например, они часто используются для правильного ведения iетчика ссылок.

С использованием класса CORBA::String_var, тот же пример можно записать так:

Стиль CORBA для C++:

CORBA::String_var str = CORBA::string_dup ("My string");

str = CORBA::string_dup ("My anither string");

Никакой утечки памяти здесь не будет: память, занятая в первой строке, будет автоматически освобождена как часть операции присваивания, а память, занятая во второй строке, будет освобождена деструктором класса CORBA::String_var.классы выполняют и другие очень полезные сервисные функции.

Строки

Строки CORBA бывают двух видов - неограниченные (unbounded) и ограниченные (bounded). Различие между ними состоит в том, что ограниченные строки не могут быть больше явно указанной длины. Хотя большинство реализаций отображения строк IDL на C++ игнорирует это различие, всегда следует иметь его в виду.

Синтаксис задания строк очень прост:

typedef string MyAliasForString;string BoundedString_20;

typedef wstring MyAliasForWideString;

Использовать typedef в общем случае необязательно - все зависит от того, в каком месте IDL-файла появляются такие объявления.

Компилятор idl2cpp генерирует классические типы данных C++ - char* или wchar_t*, и, кроме того, объектные оболочки вокруг указателей - _var- и _out-классы. Out-классы удобно использовать при работе с методами, которые возвращают результат через список аргументов этого метода.

Некоторые особенности имеет управление динамической памятью для строк. Использование new и delete может (потенциально) привести к рассогласованию средств, используемых прикладным приложением и ORBом. Чтобы избежать этой проблемы, нужно использовать не new, а CORBA::string_alloc() или CORBA::string_dup(), и не delete, а CORBA::string_free().

Массивы

Под массивом в CORBA понимается классический массив - набор данных однотипных элементов, размер которого известен заранее и не может быть изменен. Если вам нужны массивы переменной длины, то нужно использовать так называемые последовательности.синтаксис определения массива:long MyLongArray[10][20];

Для массивов использование typedef обязательно.

Массивы IDL очень похожи на строки IDL тем, что компилятор idl2cpp превращает их в обычные массивы C++. Как и для строк, для массивов генерируются вспомогательные классы-оболочки - _var- и _out, а также функции создания динамических массивов - имя_массива_alloc() и имя_массива_free(). Обе они не имеют аргументов - размер массива известен на стадии компиляции IDL-файла.

Обработка ошибок

Обработка ошибок - один из важнейших аспектов любой технологии программирования. Все современные системы и языки используют варианты одной модели, которая называется обработка исключительных ситуаций с завершением. С ней хорошо знакомы программисты на C++, Java или Delphi. Кстати, термин с завершением в ее названии не значит, что программа будет завершена - просто в общем случае продолжить выполнение с той точки, где была возбуждена исключительная ситуация, невозможно.

Язык IDL позволяет программисту определить свои типы исключительных ситуаций и объявить, что тот или иной метод возбуждает некоторые из них:

exception MyException_1 {};MyException_2

{code;description;

};MyInterface

{MyMethod_1 ();MyMethod_2 () raises (MyException_1);MyMethod_1 () raises (MyExcpetion_1,MyException_2);

};

При отображении на C++ все происходит довольно естественным образом. Для исключений генерируются отдельные классы, и вы просто отлавливаете соответствующий тип исключения в операторе catch.

Впрочем, у системы обработки ошибок CORBA есть один серьезный недостаток - в ней не поддерживается наследование исключений. Другими словами, все ваши исключения совершенно не зависят друг от друга. Ничего не поделаешь - CORBA готова поддерживать языки без встроенной системы обработки исключений.

Кроме исключений, определенных пользователем, в CORBA существует около тридцати так называемых системных исключений. Вы не должны включить ни одно из них в raises-список вашего метода, да в этом и нет необходимости - iитается, что любой удаленный метод способен возбуждать любые системные исключительные ситуации.

Системные исключения имеют одну очень интересную особенность - они в качестве поля содержат признак того, произошло ли исключение ДО выполнения каких-либо действий на стороне сервера, или оно произошло уже ПОСЛЕ.

При отображении на C++ все классы исключений