|
Руководство разработчика на IDL
Устоявшаяся практика IDL
Мы продолжаем работать над этой документацией. Новые материалы будут
добавляться к существующей основе. Пожалуйста, шлите все вопросы и комментарии в
группу netscape.public.mozilla.xpcom.
Перечисления и константы
В XPIDL константы определяются внутри интерфейсов и в JavaScript
представляются свойствами экземпляров классов которые реализуют эти интерфейсы.
Значения констант должны иметь тип short или long. Константы
других типов (например, string) возможно реализовать с помощью свойств
интерфейса с фиксированными значениями или с помощью методов, возвращающих эти
значения.
| Код XPIDL |
Пример JavaScript |
interface nsIFoo {
const short ONE = 1;
};
|
var myFoo = Components.classes["@mydomain.org/sample/foo;1"].CreateInstance();
var myFoo = myFoo.QueryInteface(Components.interfaces.nsIFoo);
print(myFoo.ONE);
OR
print(Components.interfaces.nsIFoo.ONE);
|
Возвращаемые типы
Вы можете использовать типы, отличные от void, для того чтобы
разработчикам скриптов был доступен непосредственный возврат значений. (В C++
возвращаемое значение преобразуется в выходной параметр.)
native и необработанные (raw) типы
C++
Любой интерфейс, который содержит нативные или сырые (raw) типы C++ не
может использоваться в скриптах. Если интерфейс или метод будет отмечен как
[scriptable] и, вместе с тем, будет содержать нативные или
необработанные типы C++, то компилятор XPIDL будет считать это ошибкой.
Отдельные проблемные методы в интерфейсе могут быть помечены как
нескриптуемые с помощью конструкции [noscript] перед описанием метода.
Методы, отмеченные как [noscript] будут недоступны для использования в
скриптовых языках.
| Код XPIDL |
Комментарий |
[ptr] native nsNativeType(nsFileSpec);
[scriptable] interface foo {
void BadMethod(in nsNativeType aNativeType);
};
|
Компиляция завершается ошибкой:
cannot_script.idl:4: Error: methods in [scriptable] interfaces which are
non-scriptable because they refer to native types (parameter "aNativeType") must
be marked [noscript]
[cannot_script.idl:4: Ошибка: методы в [scriptable] интерфейсах, которые
не могут использоваться в скриптах, так как ссылаются на нативные типы (параметр
"aNativeType"), должны быть отмечены как [noscript]]
|
[ptr] native nsNativeType(nsFileSpec);
[scriptable] interface foo {
[noscript] void BadMethod(in nsNativeType aNativeType);
};
|
Заголовочные файлы C++ генерируются нормально. Метод BadMethod
недоступен из JavaScript. |
Передача строк
Все строки, которые возвращаются в C++ посредством выходных параметров,
должны быть размещены в памяти с помощью nsIAllocator чтобы время жизни
строк было управляемым в XPConnect. Если строки не были размещены с помощью
nsIAllocator, то строка окажется потерянной, что влечет за собой утечку
памяти и крах.
Смотрите вопрос "How do I make 'out string' work right?" ("Как мне добиться,
чтобы 'out string' правильно работало?") в
FAQ'е по
XPConnect для получения дополнительной информации о работе со строковыми
выходными параметрами.
Названия методов
При выборе названий для своего интерфейса рекомендуется использовать
верблюжачьюНотацию, в которой первая буква является маленькой, а все последующие
члены идентификатора начинаются с больших букв. Этот стиль соответствует
существующему в JavaScript соглашению, и такие названия будут натурально
смотреться в скриптах.
В Mozilla главное соглашение об именовании методов в коде C++ требует
ВерблюжачьейНотации (первая буква - в верхнем регистре). Соответственно этому
компилятор xpidl капитализирует названия методов в сгенерированных заголовках
C++. Но даже если вы создаете IDL для существующего интерфейса, реализация
которого в C++ следует ВерблюжачьейНотации, будет лучше, если вы опишите его в
IDL согласно верблюжачьейНотации (первая буква - в нижнем регистре). Это более
привычно для разработчиков на JavaScript, а ваш код C++ останется рабочим.
[Правила и синтаксис]
[Устоявшаяся практика]
[Ключевые слова]
Mike Ang
Mike McCabe
Перевод: Д. Скоробогатов (09.10.2009)
Оригинальный текст: IDL Author's Guide - IDL Best Practices
Последнее редактирование: 2009-10-12 12:30:35
Метки материала:
классы XPCOM, язык описаниния интерфейсов, описание интерфейсов, компонент, интерфейс, interface description language, interface, компоненты XPCOM, компонентная объектная модель, IDL, COM, component object model, интерфейсы, XPIDL, XPConnect, XPCOM
Оставьте, пожалуйста, свой комментарий к публикации
|